JavaFX Stage.show() in ursprünglichem Thread starten

expensne

Mitglied
Nabend zusammen,

ich habe eine Frage bezüglich JavaFX und dem dazugehörigen Thread.

Folgende Situation:
Die Anwendung besteht aus einem Fenster, mit dem Schließen wird das Fenster via stage.hide() unsichtbar und als Trayicon angezeigt. Mit einem Doppelklick auf das Trayicon (AWT) soll das Fenster wieder mit stage.show() sichtbar werden.
Dabei bekomme ich eine IllegalStateException (currentThread = AWT-EventQueue-0) da ich das stage.show() nicht aus dem FX-Thread ausführe da ich die Methode in dem ActionListener des Tryicon's (AWT) aufrufe.

Mein Frage ist nun, wie kann ich denn das stage.show() wieder auf dem ursprünglichen FX-Thread ausführen?


Gruß,
Fabian
 
Zuletzt bearbeitet:
Könntest du bitte ein bißchen Code posten, damit wir dein Problem anschaulich nachvollziehen können?
Ansonsten vielleicht eine Funktion im JavaFx-Prozeß aufrufen oder so…
 
Versuchs mal mit Platform.runLater() ...
Bekomme zwar keine Exception mehr, aber es tut sich auch sonst nichts.

Könntest du bitte ein bißchen Code posten, damit wir dein Problem anschaulich nachvollziehen können?
Ansonsten vielleicht eine Funktion im JavaFx-Prozeß aufrufen oder so…

Habe die Stellen um die es geht mit "<-----------------------------------" markiert.

Java:
  public void start(Stage primaryStage) {
     try {
       AnchorPane root = new AnchorPane();
       Scene scene = new Scene(root, 400, 400);
       primaryStage.setScene(scene);

       // JavaFX Stage übergeben <-----------------------------------
       init(primaryStage);

       primaryStage.show();
     } catch (Exception e) {
       e.printStackTrace();
     }
   }

    private void init(Stage stage) throws AWTException {
   
        stage.setOnCloseRequest(event -> {
            event.consume();
            stage.hide();
            }
        });
   
   
        // TrayIcon
        if (SystemTray.isSupported()) {
       
            SystemTray tray = SystemTray.getSystemTray();
            TrayIcon trayicon = TrayIconCreate();
            trayicon.addActionListener(ae -> {

                // Stage aus JavaFX <-----------------------------------
                stage.show(); // <----------------------------------- Exception

            });
            tray.add(trayicon);

        } else {
            System.exit(0);
        }

    }

    // TrayIcon aus AWT <-----------------------------------
    private TrayIcon TrayIconCreate() {
        TrayIcon trayicon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icon.png")));
        return trayicon;
    }


Gruß Fabian
 
Zuletzt bearbeitet:
Genau im trayicon.addActionListener(ae -> ...); machst du:
Java:
Platform.runLater(() -> stage.show());

Nützt das was?
 
Genau im trayicon.addActionListener(ae -> ...); machst du:
Java:
Platform.runLater(() -> stage.show());

Nützt das was?

Nein wie schon gesagt, passiert nichts. Habs auch mit einer Print-Ausgabe versehen und nicht mal die wird ausgegeben.

Edit:
Wenn ich das Fenster noch offen habe und mache einen Doppelklick auf das Trayicon wird beides ausgegeben, also sowohl "event fired" als auch "run()".
Wenn ich das Fenster jedoch hide und dann einen Doppelklick auf das Trayicon mache ist das Letzte was ausgegeben wird "event fired".


Java:
      trayicon.addActionListener(ae -> {
         System.err.println("event fired");
         //TODO
         Platform.runLater(new Runnable() {
       
           @Override
           public void run() {
             System.err.println("run()");
             stage.show();
         
           }
         });
      });

Gruß,
Fabian
 
Zuletzt bearbeitet:
Ach ich weiß was es da hat. Nachdem du das letzte Fenster schließt (hide oder close), glaubt der FXThread das alles beendet ist und schließt sich selbst.
Du musst bevor du die primaryStage auf show setzt noch Platform.setImplicitExit(false); setzen. Dann funktioniert das auch.
 
Ach ich weiß was es da hat. Nachdem du das letzte Fenster schließt (hide oder close), glaubt der FXThread das alles beendet ist und schließt sich selbst.
Du musst bevor du die primaryStage auf show setzt noch Platform.setImplicitExit(false); setzen. Dann funktioniert das auch.

Stimmt, funktioniert jetzt.
Das man das bei einer close() Anweisung setzen muss war mir bewusst, aber auf die Idee, das er den Thread schon bei hide() beenden könnte, kam ich nich. Danke! 😀
 

Neue Themen


Zurück
Oben