2012-03-10 10 views
57

Bir JPanel'in yaşadığı JFrame'i nasıl alabilirim?Java/Swing: Pencereyi/JFrame'i bir JPanel içinden alın

Benim şimdiki çözüm Bir Pencere bulana kadar o (böyle devam eder) ebeveyn var için paneli istemektir: daha şık bir şekilde

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

var mı, Standart Kütüphane'de bir yöntem olabilir?

cevap

111

Üst düzey türünüze alabileceğiniz bir Pencere döndürecek SwingUtilities.getWindowAncestor(...) yöntemini kullanabilirsiniz.

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

Bu, olayları Swing'e bağlamak için Spring denetleyicileri kullanarak gerçekten yardımcı oldu. –

+0

Serin, kolay ve iyi çalışıyor. –

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

Bunu yapmanın başka bir yolu da işe yarayacak. 1+ oy. –

+4

Javadoc, bunun bir “Applet” ('Window' veya' Frame' değil) olabileceğini belirtir. – icza

24

(kendi Javadoc belirtildiği gibi) aynı işlevselliği SwingUtilities bunun için 2 doğrudan, farklı yöntemler vardır. java.awt.Window döndürürler, ancak panelinizi bir JFrame numaralı telefona eklediyseniz, JFrame güvenli bir şekilde yayınlayabilirsiniz.

2 direkt ve en basit yolu: Bütünlüğü için

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

diğer bazı yolları:

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

Bu en eksiksiz ve yararlı bir cevaptır. – lifeisfoo

1

diğer yorumcu zaten sadece yayın yapmak için genellikle geçerli değil belirtildiği gibi JFrame. Bu en özel durumlarda çalışır, ancak bu tüm diğer cevaplar olarak geçerli ve güvenli döküm ve neredeyse kadar basittir çünkü https://stackoverflow.com/a/25137298/1184842

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

tek doğru yanıt icza tarafından f3 olduğunu düşünüyorum.