Komponente entfernen + hinzufügen -> Leeres Frame?

Smily0412

Mitglied
Hoi,
mir ist heute bei dem Projekt, an dem ich gerade Sitze etwas aufgefallen:
Ich habe ein (das Einzige) Panel von einem Frame gelöscht und wollte an die gleiche Stelle ein neues hinzufügen, allerdings blieb der Frame dabei leer.

Das kam mir merkwürdig vor, also habe ich mich mal daran gesetzt den Fehler zu finden und Abzukapseln. Dabei kam der Code unten raus

Soweit ich das sehe, müsste bei dem Klick auf den Button dieser Entfernt, ein neuer Erstellt und anstelle des alten eingefügt werden.
Bei mir bleibt das Frame aber leer. und das "getComponentCount()" liefert auch eine 0 zurück..

Kann mir das jemand bitte erklären ?
Java:
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

public class ComponentControler extends JFrame implements ActionListener { 
	public static void main(String[] args) {
		new ComponentControler().setVisible(true);
	}
	
	public ComponentControler() {
		Button btn = new Button("test");
		btn.addActionListener(this);
		add(btn);
	}

	public void refresh() {
		removeAll();
		Button btn = new Button("test");
		btn.addActionListener(this);
		add(btn);
		System.out.println(getComponentCount());
	}

	public void actionPerformed(ActionEvent arg0) {
		refresh();
	}
}

cu,
Smily0412
 
Moin!
Man fügt einem JFrame nie direkt etwas zu, sondern nur dessen ContentPane..
Wenn du das beachtest und am Ende noch ein validate() aufrufst, klappt es auch:
Code:
public class ComponentControler extends JFrame implements ActionListener {

    public static void main(String[] args) {

        new ComponentControler().setVisible(true);

    }

   

    public ComponentControler() {

        Button btn = new Button("test");

        btn.addActionListener(this);

        getContentPane().add(btn);

    }

 

    public void refresh() {

        getContentPane().removeAll();

        Button btn = new Button("test2");

        btn.addActionListener(this);

        getContentPane().add(btn);

        System.out.println(getComponentCount());
        this.validate();
        

    }

 

    public void actionPerformed(ActionEvent arg0) {

        refresh();

    }

}

Ab Java 1.6 würde dein Fehler übrigens nicht mehr Auffallen, da alles was du über JFrame.add() hinzufügst, automatisch an das ContentPane weitergeleitet wird.

Weitere kleine Anmerkung, du mischt hier Swing und AWT.. sollte man eigentlich nicht machen

Und noch eine kleine Anmerkung: Schau dir vielleicht mal das CardLayout an. Das ist eigentlich dafür gedacht, um schnell Inhalte eines Containers auszutauschen...

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Zurück