2012-03-10 21 views
57

के अंदर से विंडो/जेएफआरएएम प्राप्त करें I जेएफआरएएम कैसे प्राप्त कर सकता है जिसमें एक जेपीनल रहता है?जावा/स्विंग: एक जेपीनल

मेरे वर्तमान समाधान जब तक मैं एक खिड़की को खोजने के पैनल के लिए यह माता-पिता (और इसी तरह) है पूछना है: वहाँ एक और अधिक सुरुचिपूर्ण रास्ता

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

, स्टैंडर्ड लाइब्रेरी में एक तरीका हो सकता है?

उत्तर

111

आप SwingUtilities.getWindowAncestor(...) विधि का उपयोग कर सकते हैं जो एक विंडो लौटाएगा जिसे आप अपने शीर्ष स्तर के प्रकार पर डाल सकते हैं।

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

यह स्विंग नियंत्रकों का उपयोग स्विंग में घटनाओं को तार करने के लिए वास्तव में उपयोगी था। –

+0

कूल, आसान और अच्छी तरह से काम करता है। –

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

यह करने का एक और तरीका है और यह भी काम करेगा। 1+ वोट। –

+4

जावाडोक कहता है कि यह एक 'एप्लेट' हो सकता है ('विंडो' या 'फ्रेम' नहीं)। – icza

24

वहाँ 2 प्रत्यक्ष, अलग SwingUtilities में इस के लिए तरीकों जो एक ही कार्यक्षमता प्रदान (के रूप में उनके जावाडोक में बताया गया है) कर रहे हैं। वे 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(); 
+0

यह सबसे पूरा और उपयोगी उत्तर है। – lifeisfoo

1

अन्य टिप्पणीकारों पहले से ही उल्लेख किया है इसे करने के लिए बस के लिए डाली मान्य आम तौर पर नहीं है JFrame। यही कारण है कि सबसे विशेष मामलों में काम करता है, लेकिन मैं https://stackoverflow.com/a/25137298/1184842

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

में लगता है कि केवल सही जवाब f3 icza से है, क्योंकि यह एक वैध और सुरक्षित डाली और सभी अन्य उत्तर के रूप में लगभग के रूप में सरल है।

संबंधित मुद्दे