Java / Swing: получить окно / JFrame изнутри JPanel
Как я могу получить JFrame, в котором живет JPanel?
мое текущее решение заключается в том, чтобы попросить панель для ее родителя (и так далее), пока я не найду окно:
Container parent = this; // this is a JPanel
do {
parent = parent.getParent();
} while (!(parent instanceof Window) && parent != null);
if (parent != null) {
// found a parent Window
}
есть ли более элегантный способ, метод в стандартной библиотеке может быть?
4 ответов
можно использовать SwingUtilities.getWindowAncestor(...)
метод, который вернет окно, которое вы можете привести к типу верхнего уровня.
JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
для этого есть 2 прямых, разных метода в SwingUtilities
которые обеспечивают ту же функциональность (как отмечено в их Javadoc). Они возвращаются!--3--> но если вы добавили свою панель в JFrame
, вы можете безопасно бросить его в JFrame
.
2 прямых и самых простых способа:
JFrame f1 = (JFrame) SwingUtilities.windowForComponent(comp);
JFrame f2 = (JFrame) SwingUtilities.getWindowAncestor(comp);
для полноты некоторых других способов:
JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp);
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent();
как уже упоминали другие комментаторы, обычно недопустимо просто бросать в JFrame
. Это работает в большинстве особых случаев, но я думаю, что единственный правильный ответ -f3
по icza в https://stackoverflow.com/a/25137298/1184842
JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
потому что это действительный и безопасный бросок и почти так же просто, как и все другие ответы.