Swing Panel neu laden /neu zeichnen

eidel

Mitglied
Hallo,

ich bin gerade dabei eine GUI zu erstellen. Konkret sollen jetzt in einem JPanel (specialDetail) die Komponenten geändert werden, wenn sich der Wert einer JCombobox ändert. Die Änderung in der Box lasse ich mit einem ActionListener abfangen, der daraufhin den Wert der Combobox ausliest und als Parameter der Methode setSpecialDetail übergibt.

Die Methode sieht wie folgt aus:
Java:
public void setSpecialDetail(String name){
		if (name.contains("rohr") || name.contains("Rohr") || name.contains("Flacheisen") || name.contains("flacheisen") || name.contains("Winkelstahl") || name.contains("winkelstahl")){
			specialDetail.removeAll();
			specialDetail.add(pLength);
			specialDetail.add(Box.createVerticalGlue());
			validate();
		}
		else if (name.contains("blech") || name.contains("Blech")){
			specialDetail.removeAll();
			specialDetail.add(pWidth);
			specialDetail.add(pHight);
			specialDetail.add(pThickness);
			specialDetail.add(Box.createVerticalGlue());
			validate();
		}
		else {
			specialDetail.removeAll();
			specialDetail.add(Box.createGlue());
			validate();
		}
}
Das Problem ist jetzt, dass das Neuzeichnen von specialDetail einmal mit jeder if-Bedingung funktioniert, aber danach nicht mehr. Die Methode wird aber definitiv mit dem richtigen Parameter aufgerufen und wenn man das Fenster vergrößert, ist das neue Panel auch zu sehen.
Ich nehme also an, dass das an validate() liegt. Ich habe auch schon specialDetail.validate() probiert mit demselben Ergebnis.

mfG eidel
 
Hallo,

ich bin gerade dabei eine GUI zu erstellen. Konkret sollen jetzt in einem JPanel (specialDetail) die Komponenten geändert werden, wenn sich der Wert einer JCombobox ändert. Die Änderung in der Box lasse ich mit einem ActionListener abfangen, der daraufhin den Wert der Combobox ausliest und als Parameter der Methode setSpecialDetail übergibt.

Die Methode sieht wie folgt aus:
Java:
public void setSpecialDetail(String name){
		if (name.contains("rohr") || name.contains("Rohr") || name.contains("Flacheisen") || name.contains("flacheisen") || name.contains("Winkelstahl") || name.contains("winkelstahl")){
			specialDetail.removeAll();
			specialDetail.add(pLength);
			specialDetail.add(Box.createVerticalGlue());
			validate();
		}
		else if (name.contains("blech") || name.contains("Blech")){
			specialDetail.removeAll();
			specialDetail.add(pWidth);
			specialDetail.add(pHight);
			specialDetail.add(pThickness);
			specialDetail.add(Box.createVerticalGlue());
			validate();
		}
		else {
			specialDetail.removeAll();
			specialDetail.add(Box.createGlue());
			validate();
		}
}
Das Problem ist jetzt, dass das Neuzeichnen von specialDetail einmal mit jeder if-Bedingung funktioniert, aber danach nicht mehr. Die Methode wird aber definitiv mit dem richtigen Parameter aufgerufen und wenn man das Fenster vergrößert, ist das neue Panel auch zu sehen.
Ich nehme also an, dass das an validate() liegt. Ich habe auch schon specialDetail.validate() probiert mit demselben Ergebnis.

mfG eidel

mm etwas mehr Code wäre schön, weil so sieht man ja nur die IF- Bedingungen,....

Versuch mal deine Frame größer/kleiner zu schieben wenn du was geändert hast,... trifft dann die gewünschte Änderung ein ?
 
Zuletzt bearbeitet:
Da es sich um ein JPanel handelt, probier es mal anstelle von validate() mit revalidate(). Hierbei werden dann auch die Toplevel Container von den Änderungen informiert. Sollte dies noch immer nicht reichen, so teste das Ganze noch einmal mit einem zusätzlichen repaint();. Sobald ich Komponenten lösche, hab ich das auch hin und wieder benötigt. Warum man es manchmal benötigt ist mir auch bis heute noch nicht ganz klar.

Grüße,
ymene
 
Es wäre IMHO besser specialDetail ein CardLayout zu setzen und dann jeweils das richtige Panel anzuzeigen anstatt ständig die Kinder des Panels zu ändern.
 

Zurück
Oben