2013-08-01 12 views
12

Mam aplikację swing, w której wyświetlaję obrazy w JPanel. Jeśli aplikacja nie jest w stanie stworzyć obrazu, chcę usunąć poprzedni z JPanel i zastąpić go JTextField i wiadomości. Mogę dodać pole tekstowe, ale jest ono rysowane na górze poprzedniej zawartości, która sama jest podklasą JPanel. Oto, co mam:JPanel removeWszystko nie pozbywa się poprzednich komponentów

private void displayMessage(String message) { 
    JTextField tf = new JTextField(message); 
    cdPanel.removeAll(); 
    cdPanel.add(tf, BorderLayout.NORTH);//tried lots of variations, inc. no layout  
    cdPanel.validate(); 
} 

Jak mogę uzyskać cdPanel całkowicie przerysować sam?

+0

Gdybyś próbował wywołanie 'cdPanel.revalidate(); cdPanel.repaint() 'zamiast' cdPanel.validate() '? Co więcej, w jaki sposób wyświetlane są obrazy na tym 'JPanelu'? Czy używasz 'JLabel' lub rysujesz je bezpośrednio na' JPanel'? –

+1

@NIcEcOw dzięki, że działa idealnie. Proszę napisać, że mogę oznaczyć twoją odpowiedź jako :-) – jaybee

+0

NAJBARDZIEJ WITAM SERDECZNIE I ZACHOWAJ ŚMIECH :-) Ale proszę, następnym razem, spróbuj podać informacje w pełnym zakresie, tak jakbyś wyjaśniał je dziecku, co do __Co robisz? __, __Co się spodziewasz? __ i __Co dokładnie się stało? __ W ten sposób osoba, która odpowiada, będzie mogła zapewnić lepszy wgląd w daną sytuację :-) –

Odpowiedz

25

Możesz po prostu spróbować nazywając:

cdPanel.revalidate(); 
cdPanel.repaint(); // This is required in some cases 

zamiast

cdPanel.validate(); 
+1

Dzięki! Zaoszczędził mi trochę czasu –

+0

@nIcEcOw: Dzięki, działało to jak czar. Bardzo wdzięczny za twoją odpowiedź :) – John

+0

@John: NAJBARDZIEJ WITAMY i ZACHOWAJ UŚMIECHU :-) –

3

Ponieważ masz do czynienia z nieprzewidywalnym opóźnieniem, użyj funkcji SwingWorker do załadowania w tle, jak pokazano here. W przykładzie użyto pack(), aby zmienić rozmiar etykiety na obraz, ale możesz użyć siatki o stałym rozmiarze i przeskalować obrazy, jak pokazano here.