Java / Swing: получить Window / JFrame из JPanel - PullRequest
67 голосов
/ 11 марта 2012

Как я могу получить 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 ]

126 голосов
/ 11 марта 2012

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

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
34 голосов
/ 05 августа 2014

В SwingUtilities есть два прямых, различных метода для этого, которые обеспечивают одинаковую функциональность (как отмечено в их Javadoc).Они возвращают java.awt.Window, но если вы добавили свою панель к 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();
30 голосов
/ 11 марта 2012
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
1 голос
/ 08 ноября 2016

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

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

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

...