2012-03-10 13 views
57

Come posso ottenere JFrame in cui un JPanel sta vivendo?Java/Swing: Ottenere Window/JFrame dall'interno di un JPanel

mia soluzione attuale è quello di chiedere il pannello per il suo genitore (e così via) fino a trovare una finestra:

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

c'è un modo più elegante, un metodo nella libreria standard può essere?

risposta

111

È possibile utilizzare il metodo SwingUtilities.getWindowAncestor(...) che restituirà una finestra che è possibile trasmettere al tipo di primo livello.

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

Questo è stato davvero utile utilizzando i controller Spring per collegare eventi a Swing. –

+0

Freddo, facile e funziona bene. –

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

Questo è un altro modo per farlo e funzionerà anche. 1+ voto. –

+4

Javadoc afferma che questa potrebbe essere una 'applet' (non' Window' o 'Frame'). – icza

24

Esistono 2, diversi metodi diretti di questa nel SwingUtilities che forniscono la stessa funzionalità (come indicato nel loro Javadoc). Restituiscono java.awt.Window ma se il pannello è stato aggiunto a JFrame, è possibile trasmetterlo in modo sicuro a JFrame.

I 2 modi diretti e più semplice:

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

Per completezza alcuni altri modi:

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

Questa è la risposta più completa e utile. – lifeisfoo

1

Come altri commentatori già detto, non è generalmente valido semplicemente cast JFrame. Che funziona nella maggior parte dei casi speciali, ma penso che l'unica risposta corretta è f3 da icza in https://stackoverflow.com/a/25137298/1184842

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

perché questo è un cast valido e sicuro e così semplice come tutte le altre risposte.