2013-08-01 8 views
12

Ich habe eine Swing-Anwendung, in der ich Bilder in einem JPanel anzeigen. Wenn die App das Bild nicht erzeugen kann, möchte ich das vorherige aus dem JPanel entfernen und durch ein JTextField und eine Nachricht ersetzen. Ich kann das Textfeld hinzufügen, aber es wird über den vorherigen Inhalt gezeichnet, der wiederum eine Unterklasse von JPanel ist. Hier ist, was ich habe:JPanel removeAll wird nicht von früheren Komponenten loswerden

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(); 
} 

Wie kann ich CDPanel vollständig neu zeichnen?

+0

Hatten Sie versucht, ruft 'cdPanel.revalidate(); cdPanel.repaint() 'anstelle von' cdPanel.validate() '? Wie werden Bilder auf diesem 'JPanel' angezeigt? Benutzt du 'JLabel' oder zeichne sie direkt auf' JPanel'? –

+1

@NICEcOw Danke, das funktioniert perfekt. Bitte poste, damit ich deine als Antwort markieren kann :-) – jaybee

+0

Du bist am WILLKOMMENSTEN und HÄLT LÄCHELN :-) Aber bitte versuch vom nächsten Mal, die Informationen in vollen Zügen zu geben, als würdest du es einem Kind erklären, Was __Was machst du? __, __Was erwartest du? __ und __Was ist genau passiert? __ Auf diese Weise kann die Person, die antwortet, einen besseren Einblick in die gegebene Situation geben :-) –

Antwort

25

können Sie einfach anrufen versuchen:

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

statt

cdPanel.validate(); 
+1

Danke! Rettete mich einige Zeit –

+0

@NicEcOw: Danke, das hat wie ein Charme funktioniert. Sehr geschätzt für Ihre Antwort :) – John

+0

@John: Du bist am meisten willkommen und keep smiling :-) –

3

Da Sie mit unvorhersehbaren Latenzzeiten zu tun haben, verwenden Sie eine SwingWorker, um das Laden im Hintergrund durchzuführen, wie gezeigt here. Im Beispiel wird pack() verwendet, um die Beschriftung auf die Größe des Bildes zu ändern. Sie können jedoch auch ein Raster mit fester Größe verwenden und die Bilder skalieren, wie in der Abbildung here gezeigt.

Verwandte Themen