2012-02-19 34 views
24

Piszę program, w którym mam JFrame i chcę usunąć wszystkie komponenty z niego, a następnie dodać tylko jeden składnik i odświeżyć ramkę. To, co mam tak daleko jest coś takiego jak kod poniżej (zwanym w obiekt, który implementuje JFrame, gdzie StartPanel implementuje JPanel):Jak usunąć wszystkie komponenty z JFrame w Javie?

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

Jednak, kiedy uruchomić kod pokazuje puste okno (nie startPanel) a kiedy minimalizuję/zmieniam rozmiar okna, okno staje się czarne. Jeśli pominiemy removeAll() i nie ma już elementów w JFrame, to wyświetla on startPanel dokładnie. Jakieś pomysły, jak faktycznie usunąć wszystko, a następnie uzyskać nowy panel, aby nadal się wyświetlać?

+1

jednym słowem: [CardLayout] (http: // docs.oracle.com/javase/tutorial/uiswing/layout/card.html) –

+0

@HovercraftFullOfEels, które mogą działać, ale czy jest jakiś inny sposób zrobienia tego ręcznie? i dlaczego nie działa funkcja removeAll(), jak sądzę, powinna? co jeśli w innych częściach kodu potrzebuję pewnych kombinacji różnych składników (nie tylko jednego pokazu na raz), więc nie chcę CardLayout? – scaevity

Odpowiedz

44

Należy zadzwonić

getContentPane().removeAll(); 

removeAll() nie została przesłonięta jak add() lub remove() do przekazania contentPane w razie potrzeby.

+0

wielkie dzięki, to wydaje się działać! – scaevity

+0

@scae: Kavka wydaje się mieć ostrzejsze oczy niż reszta z nas. Dobry połów i 1+. –

+0

Dziękujemy za zwięzłą i pomocną odpowiedź. 'removeAll()' naprawdę powinno zostać nadpisane tak jak 'add()' i 'remove()' tak jak opisałeś. Kolejny z dziwnych dziwactw Javy ... – Variadicism

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

Nie użyłem 'repaint()' i działa poprawnie. –

3

zakładając celem jest dodać coś innego po wyczyszczeniu rama należy zadzwonić po potwierdzić dodanie thoes składniki do zaktualizowania go

getContentPane().removeAll(); 
add(new component); 
validate();