Ответ 1
Вы можете использовать метод SwingUtilities.getWindowAncestor(...)
, который вернет Окно, которое вы можете применить к вашему типу верхнего уровня.
JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
Как я могу получить 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
}
Есть ли более элегантный способ, метод в стандартной библиотеке может быть?
Вы можете использовать метод SwingUtilities.getWindowAncestor(...)
, который вернет Окно, которое вы можете применить к вашему типу верхнего уровня.
JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
В SwingUtilities
есть два прямых, разных метода, которые обеспечивают ту же функциональность (что указано в их Javadoc). Они возвращают java.awt.Window
, но если вы добавили свою панель в JFrame
, вы можете смело отнести ее к JFrame
.
Два простых и простых способа:
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 в fooobar.com/info/97295/...
JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
потому что это действительный и безопасный литье и почти так же просто, как и все другие ответы.