Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen?

  • Themenstarter Themenstarter Gelöschtes Mitglied 67123
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 67123

Gast
  • Im Main-Fenster gibt es bspw. einen Button, der beim Klicken ein 2. Fenster öffnet
  • Im 2. Fenster gibt es einen Button, der das 2. Fenster wieder schließt
So, jetzt zum Problem:
Java:
public WindowClose(MouseEvent e) {
    ((Stage) (((ImageView) e.getSource()).getScene().getWindow())).close();
}
1. Der Code sorgt ja dafür, dass das Fenster geschlossen wird, aber im Taskmanager wird noch Java(TM) Platform SE binary (2) angezeigt.
2. Aber warte ... ich sehe gerade, dass kurz nach dem Starten schon diese (2) da steht, aber es wird beim Starten nur ein Fenster geöffnet.

Zu 1.: Kann man das so machen, dass diese (2) da hinterher nicht mehr steht oder gibt es keine andere Art, um das 2. Fenster zu schließen, ohne dass das ganze Programm beendet wird?
Zu 2.: Woran liegt das?

EDIT: Ich habe gerade herausgefunden, dass das Programm an sich immer mehr RAM benötigt, wenn man das 2. Fenster andauernd öffnet und wieder schließt. Das muss behoben werden, aber ich weiß leider nicht, wie.

Danke.
 
Zuletzt bearbeitet von einem Moderator:
Kannst du mal posten, wie du das zweite Fenster öffnest? Eine zweite Java-Instanz kommt mir komisch vor, es sei denn, das ist eine Eigenschaft von FX, von der ich nichts weiß.
 
Hast Du noch Referenzen auf die Stage oder irgendwelche Controls oder so? Stage.close() ist das gleiche wie Stage.hide(), d.h. da wird nicht direkt alles freigegeben.

Hier wäre es also wichtig, dass Du uns einmal mehr Daten zur Verfügung stellst, damit wir sehen, was Du wie machst und was du diesbezüglich in den Variablen speicherst.

Was Du Dir auch überlegen kannst: Nutze die Stage immer wieder. Also wenn Du die erneut brauchst, dann setzt du nur die Scene neu und zeigst es wieder an.
 
Kannst du mal posten, wie du das zweite Fenster öffnest? Eine zweite Java-Instanz kommt mir komisch vor, es sei denn, das ist eine Eigenschaft von FX, von der ich nichts weiß.
Natürlich. Hier der Code, wo das Fenster geöffnet wird:
Java:
public class OpenContributorsWindow {

    // get Controllers
    ContributorsController cC;
    MainController c = (MainController) ControllerRepository.getInstance().getController(MainController.class);

    Stage contributorsStage;
    Scene contributorsScene;
    Parent contributorsRoot;
    FXMLLoader contributorsLoader;

    public OpenContributorsWindow() throws IOException {
        contributorsStage = new Stage();

        contributorsLoader = new FXMLLoader(getClass().getClassLoader().getResource("Views/ContributorsWindow/Contributors.fxml"));
        contributorsRoot = contributorsLoader.load();
        cC = contributorsLoader.getController();

        contributorsScene = new Scene(contributorsRoot);
        contributorsScene.setFill(Color.TRANSPARENT);

        contributorsStage.setResizable(false);
        contributorsStage.setAlwaysOnTop(true);

        contributorsStage.setScene(contributorsScene);
        contributorsStage.initStyle(StageStyle.TRANSPARENT);
        contributorsStage.initModality(Modality.APPLICATION_MODAL);
        
        contributorsStage.show();
    }
}
Der Code für das Schließen des Fensters steht ja schon oben.
 
Was hast Du da für eine Klasse ControllerRepository? Was hältst Du da für Referenzen? Hast Du von der Klasse OpenContributorsWindow eine oder mehrere Instanzen?

Ggf. kann es Sinn machen, dass man eine Stage nicht immer neu erzeugt sondern nur, wenn contributorsStage null ist. (So Du davon nie mehrere Fenster gleichzeitig offen haben willst.)

Evtl. auch der Hinweis: So ein Verhalten, dass eine Applikation im Speicherverbrauch immer weiter ansteigt ist erst einmal nichts wildes. Es kann durchaus sein, dass der GC sich sozusagen "Zeit lässt", wenn es keine Notwendigkeit gibt, Speicher frei zu geben.
 
Was hast Du da für eine Klasse ControllerRepository? Was hältst Du da für Referenzen? Hast Du von der Klasse OpenContributorsWindow eine oder mehrere Instanzen?

Ggf. kann es Sinn machen, dass man eine Stage nicht immer neu erzeugt sondern nur, wenn contributorsStage null ist. (So Du davon nie mehrere Fenster gleichzeitig offen haben willst.)

Evtl. auch der Hinweis: So ein Verhalten, dass eine Applikation im Speicherverbrauch immer weiter ansteigt ist erst einmal nichts wildes. Es kann durchaus sein, dass der GC sich sozusagen "Zeit lässt", wenn es keine Notwendigkeit gibt, Speicher frei zu geben.
ControllerRepository hält nur alle Controller bereit, damit ich von überall die Controller des Main-Fensters ansprechen kann.

Und ContributorsController cC; habe ich nur in der Klasse deklariert, dessen Code ich bereits gepostet habe. Sonst gebe ich den Wert cC nur an andere Methoden weiter.

Und ich habe das mit dem contributorsStage auf null überprüfen mal ausprobiert, damit es nicht immer wieder neu erzeugt wird, aber wenn ich das 2. Fenster wieder schließen möchte, ist contributorsStage schon wieder null. Somit kann ich das 2. Fenster auch nicht mehr mit contributorsStage.hide(); schließen:
Java:
public void open() {
    if (contributorsStage == null) {
    // ...
    contributorsStage.show();
    // Hier ist contributorsStage != null
    }
}

public void close() {
    // Hier ist contributorsStage == null
    contributorsStage.hide(); // NullPointerException
}
So ganz finde ich mich noch nicht zurecht. 🤔
 
kann man auch den magischen controller im ganzen sehen ?

und wie und wann und wo was getan wird..
 
Java:
public class OpenContributorsWindow {

    // get Controllers
    ContributorsController cC;
    MainController c = (MainController) ControllerRepository.getInstance().getController(MainController.class);

    Stage contributorsStage;
    Scene contributorsScene;
    Parent contributorsRoot;
    FXMLLoader contributorsLoader;

    public OpenContributorsWindow() throws IOException {
        contributorsStage = new Stage();

        contributorsLoader = new FXMLLoader(getClass().getClassLoader().getResource("Views/ContributorsWindow/Contributors.fxml"));
        contributorsRoot = contributorsLoader.load();
        cC = contributorsLoader.getController();

        contributorsScene = new Scene(contributorsRoot);
        contributorsScene.setFill(Color.TRANSPARENT);

        contributorsStage.setResizable(false);
        contributorsStage.setAlwaysOnTop(true);

        contributorsStage.setScene(contributorsScene);
        contributorsStage.initStyle(StageStyle.TRANSPARENT);
        contributorsStage.initModality(Modality.APPLICATION_MODAL);
        
        contributorsStage.show();
    }
}
diese klasse benutzt weder den c noch den cc und die stage übergibst du nicht weiter .. aber die kann man auch anders kriegen von daher bin ich mir unsicher
 
Java:
public class OpenContributorsWindow {

    // get Controllers
    ContributorsController cC;
    MainController c = (MainController) ControllerRepository.getInstance().getController(MainController.class);

    Stage contributorsStage;
    Scene contributorsScene;
    Parent contributorsRoot;
    FXMLLoader contributorsLoader;

    public OpenContributorsWindow() throws IOException {
        contributorsStage = new Stage();

        contributorsLoader = new FXMLLoader(getClass().getClassLoader().getResource("Views/ContributorsWindow/Contributors.fxml"));
        contributorsRoot = contributorsLoader.load();
        cC = contributorsLoader.getController();

        contributorsScene = new Scene(contributorsRoot);
        contributorsScene.setFill(Color.TRANSPARENT);

        contributorsStage.setResizable(false);
        contributorsStage.setAlwaysOnTop(true);

        contributorsStage.setScene(contributorsScene);
        contributorsStage.initStyle(StageStyle.TRANSPARENT);
        contributorsStage.initModality(Modality.APPLICATION_MODAL);
      
        contributorsStage.show();
    }
}
diese klasse benutzt weder den c noch den cc und die stage übergibst du nicht weiter .. aber die kann man auch anders kriegen von daher bin ich mir unsicher
MainController hatte ich nur versehentlich drin gelassen. Ich brauche ContributorsController nur zum Ändern der Sprache, genauso hätte ich cC = contributorsLoader.getController(); rauslassen können, weil der Controller ja schon in der fxml steht. Somit spielen die Controller sonst keine Rolle beim Öffnen des 2. Fensters.
 

Zurück
Oben