2012-03-10 15 views
57

Jak mogę uzyskać JFrame, w którym żyje JPanel?Java/Swing: Uzyskaj Window/JFrame od wewnątrz JPanel

Mój obecny rozwiązaniem jest zwrócenie się do panelu za to rodzic (i tak dalej), aż znajdę okno:

Container parent = this; // this is a JPanel 
do { 
    parent = parent.getParent(); 
} while (!(parent instanceof Window) && parent != null); 
if (parent != null) { 
    // found a parent Window 
} 

Czy istnieje bardziej elegancki sposób, sposób, w Bibliotece standard może być?

Odpowiedz

111

Można użyć metody SwingUtilities.getWindowAncestor(...), która zwróci okno, które można rzutować na typ najwyższego poziomu.

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

To bardzo przydatne przy użyciu kontrolerów Spring do podłączenia zdarzeń do Swing. –

+0

Fajne, łatwe i działa dobrze. –

29
JFrame frame = (JFrame)SwingUtilities.getRoot(x); 
+0

To jest inny sposób, aby to zrobić i będzie działać. 1+ głosować. –

+4

Javadoc stwierdza, że ​​może to być "Applet" (nie "Window" lub "Frame"). – icza

24

Istnieją 2 bezpośrednie, różne sposoby do tego w SwingUtilities, które zapewniają tę samą funkcjonalność (jak wskazano w ich Javadoc). Zwracają one java.awt.Window, ale jeśli dodałeś swój panel do JFrame, możesz bezpiecznie przesłać go do JFrame.

W 2 bezpośrednie i najbardziej proste sposoby:

JFrame f1 = (JFrame) SwingUtilities.windowForComponent(comp); 
JFrame f2 = (JFrame) SwingUtilities.getWindowAncestor(comp); 

Dla kompletności kilka innych sposobów:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp); 
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp); 
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent(); 
+0

Jest to najbardziej kompletna i przydatna odpowiedź. – lifeisfoo

1

Jak inni komentatorzy już wspomnieli, że generalnie nie jest ważne, aby po prostu rzucać się JFrame. Który działa w większości przypadków szczególnych, ale myślę, że jedyną poprawną odpowiedzią jest f3 przez icza w https://stackoverflow.com/a/25137298/1184842

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

ponieważ jest to prawidłowy i bezpieczny obsada prawie tak proste jak wszystkie inne odpowiedzi.