# Mehrere Fenster mit JFrame



## petetheat (20. Dez 2007)

Hallo,

Ich hab ein Programm, welches ich ueberarbeiten soll. Dabei kann man verschiedene Sachen anklicken und es oeffnen sich neue Fenster. Diese sind alle JFrames. Jetzt ist das Problem, das einmal die Taskleiste voll ist mit all den neuen Fenstern. Dann kann ich auch noch zwischen allen umschalten, was auch nicht sein soll. Und das groesste Problem ist dann, wenn ich in einem Fenster auf's X klicke, schliessen alle.

Ich weiss, dass ich die Probleme nicht habe, wenn ich statt JFrame JDialog verwende. Das hab ich natuerlich auch probiert umzusetzen, geht aber leider nicht immer. 

Jetzt meine Frage, gibt's die Moeglichkeit, die Klassen als JFrames zu belassen, jedoch mit den Eigenschaften eines JDialogs?

Gruss, Pete


----------



## Niki (20. Dez 2007)

Ich weiß jetzt nicht auf die schnell ob es geht, aber ist das denn tatsächlich gewollt? Meiner Meinung nach sollte eine Applikation nur ein JFrame besitzen und sonst nur JInternalFrames oder JDialog.
Schildere mal die Probleme die auftreten wenn du versuchst die Frames auf JDialog umzustellen


----------



## petetheat (20. Dez 2007)

Das Problem ist zum einfach, dass das Programm ziemlich umfangreich und eine sehr grosse Anzahl an Klassen besitzt und ich suche jetzt "the easy way out", da ich nicht unbedingt Lust habe, alles zu durchsuchen und zu aendern


----------



## petetheat (20. Dez 2007)

Ich bekomme es ausserdem nicht hin, JFrame in JDialog zu aendern, das Programm spuckt nur Fehlermeldungen (VerifyError) aus, dass JDialog Incompatible argument to function sei... Wenn ich dann in den entsprechenden Funktionen nachschaue, ist aber JDialog als Argument geaendert. Trotzdem geht's nicht... grmpf


----------



## petetheat (20. Dez 2007)

So, ich hab jetzt ueberall JFrame durch JDialog ersetzt. Es scheitert aber einfach an Kleinigkeiten, wie z.B. das die JFrames mit dem NetBeans GUI Builder erstellt wurden und ich in dem generierten Quelltext nichts aendern kann. So bleibt zum Beispiel


```
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
```

stehen, obwohl's fuer den JDialog


```
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE)
```

sein muesste.

Gibt's echt keine Moeglichkeit, dass mit JFrames zu realisieren?


----------



## JavaAdam (20. Dez 2007)

Hast du schonmal geguckt ob ein JDesktopPane dir weiterhilft? Dabei müsstest du die JFrames in JInternalFrames umschreiben. Ich glaube aber, dass das einfache wäre als diese in JDialogs umzuschreiben.


----------



## petetheat (21. Dez 2007)

Das hab ich noch nicht probiert, ich guck's mir gleich mal an. 

Was ich jedoch probiert hatte, und was auch erst ganz viel versprechend aussah, war


```
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
```

zu


```
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE)
```

fuer den JFrame zu aendern. Das klappt mit maessigem Erfolg, weil zwar dann nur das letzte Fenster verschwindet und Programm offen bleibt, aber teilweise habe ich mehrere JFrames und wenn ich dann das letzte zu mache, springt der zum Main Fenster zurueck und ich kann die anderen JFrames, die noch offen sind, nicht mehr anklicken.

Gibt's da Abhilfe?


----------



## petetheat (21. Dez 2007)

So, ich muss nochmal nerven (aber dafuer ist das Forum ja da  )

Also, ich kann das Problem umgehen, in dem ich den Parent Frame enable:


```
public MyView(javax.swing.JFrame ParentView) {
        
        //Disabling previous window
        this.ParentView = ParentView;
        ParentView.setEnabled(true);
```

Dadurch kann ich natuerlich zwischen den Fenster hin- und herschalten. Umgehen kann ich das indem ich


```
ParentView.setEnabled(false);
```

setze. Da ich aber 


```
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE)
```

gesetzt habe und dann ueber das X das Fenster schliesse, ist der Parent Frame immer noch disabled.

Kann ich's irgendwie machen, dass wenn ich auf das X klicke, dass der dann z.B. den Parent Frame wieder enabled, mir also quasi eine eigene DefaultCloseOperation definiere?


----------



## JavaAdam (21. Dez 2007)

Das Schliessverhalten von Fenstern kannst du immer mit einem eigenen WindowListener steuern. Die setDefaultCloseOperation ist nur eine Hilfe, wenn es schnell und/oder einfach gehen muss.
Schau mal in die API rein.


----------



## petetheat (21. Dez 2007)

Darauf bin ich auch inzwischen gestossen, es tut sich aber nichts.


```
public class MyView extends javax.swing.JFrame implements WindowListener {

...
```

und dann 


```
public void windowClosing(WindowEvent e) {
        System.out.println("Window is closing");
        ParentView.setEnabled(true);
        this.dispose();
}
```


die Meldung wird auch nicht ausgegeben, also irgendwie wird das nicht aufgerufen. Hab ich noch was vergessen?


----------



## mimo (21. Dez 2007)

Hallo,

du kanst mit Hilfe des WindowAdapters die Kontrolle der Close-Funktion übernehmen und somit auf dein ParentWindow zugreifen. Allerdings jenachdem wieviel Aufwand und wieviel Fenster du kontrollieren möchtest rate ich dir doch zu einem DesktopPane, da das Benutzerempfinden in der Regel deutlich gesteigert wird.

Gruß

MIMO


----------



## petetheat (21. Dez 2007)

Ich hatte


```
addWindowListener(this)
```

vergessen, jetzt geht's 


Aber ich schau mir jetzt nochmal DesktopPane an, vielleicht wird's ja damit echt noch einfacher!! 
Danke fuer die ganzen Antworten!!!


----------

