# JFrame: Inhalt zur Laufzeit ändern



## rik0 (7. Dez 2007)

Hi,

ich habe ein Projekt bei dem mehrere Ansichten als seperate JFrames implementiert wurden. Diese Ansichten sollen nun in einem JFrame zusammengeführt werden. 
Es soll also einen HauptFrame geben, in dem man über das Menü oder auch Kontextmenüs in die verschiedenen Ansichten kommt. Das Menü bleibt dabei immer gleich. 

Wie macht man sowas am besten/elegantesten?

- Sobald sich die Ansicht ändert den aktuellen Frame 'disposen' und einen komplett neuen Frame anzeigen? Scheint mir keine elegante Lösung zu sein, weil man ja auch ein kurzes Flackern sehen würde oder?

- CardLayout? Dann wären doch alle Frames gleichzeitig im Speicher!? Manche Frames haben Tabellen, die sich alle paar Sekunden automatisch aktualisieren (Datenbank-Anbindung). Würden die Frames sich auch aktualisieren, wenn sie gerade nicht sichtbar sind?

- Hauptframe statisch deklarieren? Dann könnte man von überall im Programm mit setContentPane() den Inhalt ändern. 

- andere Methode?

Mir scheint es am besten zu sein, den Hauptframe statisch zu deklarieren und dann immer den ContentPane zu verändern. Ich würde dann die einzelnen Ansichten in Klassen vom Typ Container verpacken. Ich habe es testweise mal probiert und es klappt auch soweit allerdings sieht man beim Wechsel zu einer anderen Ansicht zuerst die neuen Buttons über der alten Ansicht und dann (nach ner halben Sekunde oder so) erst den Rest, was natürlich unschön ist. Woran könnte das liegen?

vielleicht hat jemand eine Idee

Gruß

riko


----------



## Gast2 (7. Dez 2007)

ich weiß ja nicht wie du das änderst möchtest ,aber z.B durch einen Buttondruck erzeugst du einfahc dort dein neues Panel removst des alte und addest dein neues....


----------



## happy_robot (7. Dez 2007)

versuchs mal mit einem invalidate auf der alten contenPane bevor du die neue setztst.

ich glaube mich aber erinnern zu können daß man an einem remove auf der contentpane nicht rumkommt damits gut aussieht. invalidate und repaint auf der neuen pane sind natürlich auch notwendig.


----------



## seekingone (12. Dez 2007)

@rik0

Ich habe zwar keine Lösung für Dich, aber was Du da machst klingt genau nach dem, was ich gerne tun würde 

Ich habe ein JFrame (Klasse Hauptfenster) und mehrere JPanel (Klasse Panel1, Panel2 usw.) diese JPanel sollen zur Laufzeit dynamisch wechseln, also immer nur ein JPanel in einem bestimmten anzeigebereich des JFrames zu sehen sein. So ist zum Beispiel auf dem JPanel1 ein Button der das JPanel2 aufrufen soll, welches dann das Panel1 löscht und an der selben stelle erscheint.

Das Problem ist, dass die JPanel weder den JFrame noch die anderen JPanel "kennen". Der Code der JPanels liegt ja in meinen seperaten Klassen, da diese JPanels mit einem GUI Builder erstellt wurden. Wie bekomme ich es nun fertig das durch das Aktivieren (drücken) eines Buttons, welcher auf einem JPanel "sitzt" der Bereich eben dieses JPanels im JFrame mit dem nächten JPanel "überschrieben" wird.


----------



## rik0 (12. Dez 2007)

Also ich habe es jetzt mit einem statischen HauptFrame gelöst.

In der Klasse Hauptframe:

```
public static HauptFrame currentFrame;
```

und

```
public void showPanel(JPanel newPanel) {
    	this.getContentPane().removeAll();
    	this.getContentPane().add(newPanel);
    	newPanel.revalidate();
    }
```

Im Konstruktor von Hauptframe:

```
HauptFrame.currentFrame = this;
```


Jetzt kann man von überall im Programm ein neues JPanel anzeigen lassen:

```
JPanel neuesPanel = new JPanel();
Hauptframe.currentFrame.showPanel(neuesPanel);
```


----------



## Guest (13. Dez 2007)

WUNDERBAR!  :toll: 

DANKE!  :applaus:


----------



## Guest (14. Dez 2007)

schau dir mal das SinegtonPattern an ... das ist genau das was du suchst....


----------



## Guest (14. Dez 2007)

soory singeltonPattern


----------

