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
, Это работает в большинстве особых случаев, но я думаю, что единственный правильный ответ f3
по icza в /questions/5252271/javaswing-poluchit-windowjframe-iz-jpanel/5252288#5252288
JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
потому что это правильный и безопасный состав и почти так же просто, как и все остальные ответы.