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). Они возвращаются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
. Это работает в большинстве особых случаев, но я думаю, что единственный правильный ответf3
по icza в https://stackoverflow.com/a/25137298/1184842JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
потому что это действительный и безопасный бросок и почти так же просто, как и все другие ответы.