2012-03-10 44 views
57

Làm cách nào để có được JFrame trong đó JPanel đang sinh sống?Java/Swing: Nhận Window/JFrame từ bên trong một JPanel

giải pháp hiện tại của tôi là yêu cầu bảng điều khiển cho nó là cha mẹ (và vân vân) cho đến khi tôi tìm thấy một cửa sổ:

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ó một cách thanh lịch hơn, một phương pháp trong các thư viện chuẩn có thể được?

Trả lời

111

Bạn có thể sử dụng phương pháp SwingUtilities.getWindowAncestor(...) sẽ trả về Cửa sổ mà bạn có thể truyền tới loại cấp cao nhất của mình.

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

Điều này thực sự hữu ích khi sử dụng bộ điều khiển Spring để kết nối các sự kiện với Swing. –

+0

Mát mẻ, dễ dàng và hoạt động tốt. –

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

Đó là một cách khác để làm điều này và cũng sẽ hoạt động. 1+ phiếu bầu. –

+4

Javadoc nói rằng đây có thể là 'Applet' (không phải' Window' hoặc 'Frame'). – icza

24

Có 2 trực tiếp, phương pháp khác nhau cho điều này trong SwingUtilities mà cung cấp các chức năng tương tự (như đã nêu trong Javadoc của họ). Họ trả về java.awt.Window nhưng nếu bạn đã thêm bảng điều khiển của mình vào số JFrame, bạn có thể truyền an toàn trang đó thành JFrame.

2 cách trực tiếp và đơn giản nhất:

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

Để hoàn chỉnh một số cách khác:

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

Đây là câu trả lời đầy đủ và hữu ích nhất. – lifeisfoo

1

Như nhà bình luận khác đã đề cập đến nó không phải là thường hợp lệ chỉ đơn giản là đúc để JFrame. Điều đó không làm việc trong hầu hết các trường hợp đặc biệt, nhưng tôi nghĩ rằng câu trả lời đúng duy nhất là f3 bởi icza trong https://stackoverflow.com/a/25137298/1184842

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

bởi vì đây là một dàn diễn viên hợp lệ và an toàn và gần như đơn giản như tất cả các câu trả lời khác.

Các vấn đề liên quan