Java/Swing: получить Window/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);

Есть два прямых, разных метода для этого в 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();
JFrame frame = (JFrame)SwingUtilities.getRoot(x);

Как уже упоминали другие комментаторы, в общем случае просто не JFrame, Это работает в большинстве особых случаев, но я думаю, что единственный правильный ответ f3 по icza в /questions/5252271/javaswing-poluchit-windowjframe-iz-jpanel/5252288#5252288

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

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

Другие вопросы по тегам