2012-02-19 54 views
24

Tôi đang viết một chương trình mà tôi có JFrame và tôi muốn xóa tất cả các thành phần khỏi nó, sau đó chỉ thêm một thành phần vào nó và vẽ lại khung. Những gì tôi có cho đến nay là một cái gì đó giống như mã dưới đây (gọi tắt là trong một đối tượng mà thực hiện JFrame, nơi StartPanel thực hiện JPanel):Làm thế nào để loại bỏ tất cả các thành phần từ một JFrame trong Java?

removeAll();  
startPanel = new StartPanel(); 
startPanel.setVisible(true); 
add(startPanel); 
revalidate(); 
repaint(); 

Tuy nhiên, khi tôi chạy mã nó cho thấy một cửa sổ trống rỗng (không phải là startPanel) và khi tôi thu nhỏ/thay đổi kích thước cửa sổ, cửa sổ chuyển sang màu đen. Nếu tôi rời khỏi removeAll() và không có các phần tử đã có trên JFrame thì nó sẽ hiển thị startPanel tốt. Bất kỳ ý tưởng về cách thực sự loại bỏ tất cả mọi thứ, và sau đó nhận được bảng điều khiển mới vẫn hiển thị?

+1

Một từ: [CardLayout] (http: // docs.oracle.com/javase/tutorial/uiswing/layout/card.html) –

+0

@HovercraftFullOfEels có thể hoạt động, nhưng có cách nào khác để thực hiện thủ công không? và tại sao không phải là removeAll() hoạt động như tôi nghĩ? những gì nếu trong các phần khác của mã tôi cần phải có một số kết hợp của các thành phần khác nhau (không chỉ một hiển thị tại một thời điểm), vì vậy tôi không muốn có một CardLayout? – scaevity

Trả lời

44

Bạn phải gọi

getContentPane().removeAll(); 

removeAll() chưa được ghi đè như add() hoặc remove() để chuyển tiếp đến contentPane khi cần thiết.

+0

cảm ơn rất nhiều, điều này dường như hoạt động! – scaevity

+0

@scae: Kavka xuất hiện để có đôi mắt sắc nét hơn so với phần còn lại của chúng tôi. Tốt bắt và 1+. –

+0

Cảm ơn bạn đã trả lời ngắn gọn và hữu ích. 'removeAll()' thực sự nên được ghi đè như 'add()' và 'remove()' theo cách bạn mô tả. Chỉ cần một số khác của quirks lẻ của Java ... – Variadicism

5
getContentPane().removeAll(); 
getContentPane().repaint(); 
+0

Tôi đã không sử dụng 'repaint()' và nó chạy một cách chính xác. –

3

giả mục tiêu của bạn là thêm cái gì khác sau khi bạn rõ ràng khung bạn nên gọi xác nhận sau khi thêm các thành phần thoes để cập nhật nó

getContentPane().removeAll(); 
add(new component); 
validate(); 
Các vấn đề liên quan