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 61

4 ответа:

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

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

есть 2 прямых, различные методы для этого в 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 в https://stackoverflow.com/a/25137298/1184842

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

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