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 frame = (JFrame)SwingUtilities.getRoot(x);

как уже упоминали другие комментаторы, обычно недопустимо просто бросать в JFrame. Это работает в большинстве особых случаев, но я думаю, что единственный правильный ответ -f3 по icza в https://stackoverflow.com/a/25137298/1184842

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);

потому что это действительный и безопасный бросок и почти так же просто, как и все другие ответы.