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
}

Есть ли более элегантный способ, метод в стандартной библиотеке может быть?

Ответ 1

Вы можете использовать метод SwingUtilities.getWindowAncestor(...), который вернет Окно, которое вы можете применить к вашему типу верхнего уровня.

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

Ответ 2

JFrame frame = (JFrame)SwingUtilities.getRoot(x);

Ответ 3

В SwingUtilities есть два прямых, разных метода, которые обеспечивают ту же функциональность (что указано в их Javadoc). Они возвращают java.awt.Window, но если вы добавили свою панель в JFrame, вы можете смело отнести ее к JFrame.

Два простых и простых способа:

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();

Ответ 4

Как уже отмечали другие комментаторы, это обычно не справедливо для простого перевода в JFrame. Это работает в большинстве особых случаев, но я считаю, что единственным правильным ответом является f3 от icza в fooobar.com/info/97295/...

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

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