# Anderes Panel nach Button-Klick laden



## Transmitter (25. Aug 2004)

Hi 

Ich versuche nach einem Klick auf einen Button ein anderes Panel zu laden.

Ich habe einmal ein JFrame, auf dem ein paar Panel sind ( Navigation, Content, .. )
Nach einem Klick bei Navigation sollte sich eine andere Klasse mit einem anderen Content laden.

Hat da jemand eine gute Idee?

Hatte schonmal nach MVC Frameworks gesucht, aber irgendwie nur Struts gefunden und ich programmiere ja nicht für den Webbereich 

Vielen Dank schon mal
Bye, Transmitter


----------



## Xenophon (25. Aug 2004)

```
deinJFrame.setContentPane(panel);
```


----------



## Transmitter (6. Sep 2004)

Ich sitze da jetzt schon ewig dran und komme nicht weiter :-/

Ich habe eine Background Klasse:


```
public class Background extends JFrame implements ActionListener

...

private BackgroundPanel getJPanelEast ( )
{
  ????
}
```
Standardmäßig wird Navigation1.class geladen, das mache ich mit einer switch.
Wenn ich auf einen Button in Navigation1 klicke soll getJPanelEast neu aufgerufen werden, mit dem Wert, der aus dem Button kommt, z.B. 2 für Navigation2.class.

Wie bekomme ich das hin, dass sich getJPanelEast neu aufruft, wenn ich auf einen Button in der Navi klicke?
Die Navi wird von Background importiert und instanziert, quasi als Aggregation.

Hört sich schon fast nach Threads an, oder geht das auch irgendwie anders?


```
Navigation1 extends JPanel
{
...
JPanel getNavigation ( )
{
...
}
}
```

Navigation2 ist ähnlich.
Funktioniert auch ohne Probleme, wenn ich in der switch den case von Hand festlege.

Danke schon mal
Bye, Transmitter[/code]


----------



## Transmitter (7. Sep 2004)

Das muss doch irgendjemand wissen?

Oder kennt jemand noch ein gutes Forum, in dem ich so eine Frage beantwortet bekommen könnte?


----------



## L-ectron-X (7. Sep 2004)

Threads? Unfug! Brauchst Du hier nicht.
Entferne die alte (J)Component mit der remove()-Methode.
Füge dann das neue (J)Panel mit der add()-Methode hinzu.
Rufe zum Neuzeichnen die validate()-Methode auf.
In Ausnahmefällen kann es helfen, danach auch noch die repaint()-Methode aufzurufen.


----------



## Transmitter (7. Sep 2004)

Ok, dankeschön .. hört sich schon besser an 

Werde ich dann moren mal testen.


----------



## Transmitter (8. Sep 2004)

Doch, noch ein Problem habe ich .. 

Es sind 3 Objekte, einmal der Background, der die Navigation lädt, und die 2 Navigationen .. wie sollen die denn miteinander kommunizieren?

Kann ein Objekt das ein Attribut eines Objektes ist das "obere" Objekt dazu veranlassen eine Methode aufzurufen?
Also sowas wie parent.method ( ) nur ohne Vererbung?


----------



## L-ectron-X (8. Sep 2004)

Wenn sich Dein Background ums Laden der Navigationen kümmert, übergibst Du nach einem Klick auf einen Button in der gerade aktiven Navigation, einer passenden Methode der Backgorund-Referenz eine Referenz der neu zu ladenen Navigation.
Da schlage ich vor, die übergebene Naviagtions-Referenz in einer privaten Variable in der Background-Klasse zu speichern.
Das heißt auch, dass Du den Konstuktoren der Navigationen eine Referenz Deiner Background-Klasse übergeben musst, damit sie wissen, an wen sie sich wenden müssen.


```
//Background-Klasse
private activeNavigation;
private Navigation1 navi1;
private Navigation2 navi2;
...
//im Kostruktor der Background-Klasse
  navi1 = new Navigation1(this);
  navi2 = new Navigation2(this);
...
...
...
//irgendwo in der Background-Klasse
public void setActiveNavigation(JPanel navigation) {
  if(activeNavigation != null)
    getContentPane().remove(activeNavigation);
  activeNavigation = navigation;
  getContentPane().add(activeNavigation);
  validate();
  repaint();
}
```


```
//eine Navigations-Klasse
private Background owner; //Referenz auf die Background-Klasse
...
...
...
public Navigation(Backgound owner) {
  this.owner = owner;
  ...
  ...
  ...
}
```

So ähnlich, aber doch anders, habe ich das schon mal in einer Klasse implementiert.
Aber Du wirst den Code wahrscheinlich noch an Deine "Umgebung" anpassen müssen. Z.B. LayoutManager o.ä.

Ich hoffe, dass Dir dies weiter helfen wird.


----------



## Transmitter (9. Sep 2004)

Hoffe, das kann ich irgendwie umbauen.

Würdest du sagen, das war ein eher schelchtes Design?
Ich befinde mich damit irgendwie in einer Sackgasse, finde aber auch nicht wirklich eine gute Alternative .. :-/
Kannst du mir da für die Zukunft etwas empfehlen?

Dankesehr schon / noch mal


----------



## L-ectron-X (9. Sep 2004)

Schlechtes Design? Hm. Ich habe von Deinem Programm nicht viel gesehen, außer die wenigen Zeilen.
Bei einem guten Design, werden Daten-Klassen von GUI-Klassen getrennt. Funktionalität, Flexibilität und Wiederverwendbarkeit kann durch Einsatz von Interfaces erhöht werden.
Gutes Design bedeutet auch, Klassen zu abstrahieren, also durch Vererbung immer weiter zu verfeinern bzw. zu spezialisieren.


----------

