# AWT: Panel durch anderes Panel ersetzen. Neuzeichnen-Problem



## Semmerl (20. Mai 2005)

Hab ein großes Problem.
Will ein Panel mit einem anderen Panel ersetzen, jedoch wird es mir nicht neu gezeichnet.

//Mit dieser Methode füge ich einfach mal drei Panels zu meinem übergeordneten Panel hinzu.

```
private Panel getPanel() {
        if (panel == null) {
            panel = new Panel();
            panel.setLayout(new BorderLayout());
            panel.add(getPanel1(), java.awt.BorderLayout.NORTH);
            panel.add(getPanel2(), java.awt.BorderLayout.CENTER);
            panel.add(getPanel3(), java.awt.BorderLayout.SOUTH);         
        }
return panel;
}
```

//Diese Methode setzt mir das Panel panelmiddle mit einem Middlepanel -->Dies ist eine Klasse, die von einem Panel abgeleitet ist und auf der sich verschiedene Grafiken befinden

```
private Panel getPanel2() {
        if (panelmiddle == null) {
            panelmiddle = new Middlepanel();
            panelmiddle.setLayout(new FlowLayout());        
        }
        return panelmiddle;
    }
```


Nun möchte ich dieses panelmiddle ersetzen mit einem neuen Panel, dass ich von einer anderen Klasse abgeleitet habe. Dazu rufe ich, nachdem ich auf dem Middlepanel einen Button per Mouse geklickt habe die Methode getscanpanel() auf und diese liefert mir nun eben ein neues Panel zurück und sollte eigentlich das Panel neu zeichnen.

```
public void getscanpanel()
    {
        this.panel.remove(panelmiddle);
        panel.add(getPanelscan(), java.awt.BorderLayout.CENTER);
        this.repaint();
        panel.repaint();
        panel.paint(this.getGraphics());
        panel.update(this.getGraphics());
    }
```

//Die Methode getPanelscan() schaut so aus:

```
private Panel getPanelscan() {
        if (panelmiddle_scan == null) {
            panelmiddle_scan = new Scanpanel();
            this.panelmiddle_scan.setLayout(new FlowLayout());
            this.panelmiddle_scan.setVisible(true);
            this.panelmiddle_scan.repaint();
            
        }
        return panelmiddle_scan;
    }
```

*Doch leider passiert hier nichts und das Panel wird nicht ersetzt. Habe schon alles versucht (z.b validate oder sämtliche Sachen mit repaint und komme aber nicht drauf, wieso er mir das nicht updatet. Hoffe ihr könnt mir hier helfen und ich hoffe, die Code Ausschnitte genügen*


----------



## Semmerl (20. Mai 2005)

Hab zumindest jetzt mal geschafft, dass das eine Panel verschwindet und das andere auftaucht, allerdings erst wenn ich einmal auf den Rand des Frames klicke (also ihm gewissermaßen einen Resize des Frames vortäusche)

Wie kann ich das machen, dass das neue Panel automatisch erscheint?

mfg
Andy


----------



## K0NFUZIUS (21. Mai 2005)

Hallo,

versuche es mal mit 

```
this.validate()
```

Gruß Jörg


----------



## Semmerl (22. Mai 2005)

K0NFUZIUS hat gesagt.:
			
		

> Hallo,
> 
> versuche es mal mit
> 
> ...




Hilft leider nicht.... 
Weiß vl. irgendwer was im Hintergrund gemacht wird, wenn ich einen Resize des Frames mache? Welche Methoden werden da aufgerufen... Das komische is, dass mir das neue Panel dann angezeigt wird, sobald ich auf die Frame-Aussenkante drücke, also das Programm annimmt, wie wenn ich einen Resize mache...


Danke für eure Ratschläge

Mfg
Andy


----------



## L-ectron-X (23. Mai 2005)

Ich hatte ein einziges Mal ein ähnliches Problem in einem Programm, da wollte sich eine Komponente nicht neu zeichnen lassen. Ich habs dann mit der Kombination hinbekommen:

```
validate();
repaint();
```


----------

