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:

Schmetterhand

Aktives Mitglied
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…
 

expensne

Mitglied
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:

Flown

Administrator
Mitarbeiter
Genau im trayicon.addActionListener(ae -> ...); machst du:
Java:
Platform.runLater(() -> stage.show());

Nützt das was?
 

expensne

Mitglied
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:

Flown

Administrator
Mitarbeiter
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.
 

expensne

Mitglied
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! :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
OSchriever Auf Stage von FXML-Controller zugreifen AWT, Swing, JavaFX & SWT 12
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
D JavaFX Ein Parameter von einem Stage(GUI) zu einem anderen übergeben AWT, Swing, JavaFX & SWT 6
E Aktuelle Uhrzeit auf jeder Stage anzeigen lassen (JavaFX) AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
R Größe von Scene und stage an grid anpassen AWT, Swing, JavaFX & SWT 4
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
S JavaFX GridPane Zellen Seitenverhätnis passend ändern mit der Stage AWT, Swing, JavaFX & SWT 0
MiMa Jumping Stage Flash AWT, Swing, JavaFX & SWT 8
K Globaler Stage- und Taskmanager AWT, Swing, JavaFX & SWT 3
MaxG. JavaFX JavaFX Stage nicht minimierbar machen AWT, Swing, JavaFX & SWT 2
K JavaFX Stage wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
Tort-E JavaFX Stage reload, refresh ... AWT, Swing, JavaFX & SWT 3
Krappe87 JavaFX minWidth/minHeigth der Stage (des Fensters) festlegen AWT, Swing, JavaFX & SWT 4
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
N JavaFX Stage aktualisieren AWT, Swing, JavaFX & SWT 5
M JavaFX Stage in einer FXML-Controllerklasse ermitteln? AWT, Swing, JavaFX & SWT 5
JAVAnnik JavaFX Maximize undecorated Stage (JavaFX 8) AWT, Swing, JavaFX & SWT 3
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
Tort-E JavaFX Mehere "Widgets" in einer Stage AWT, Swing, JavaFX & SWT 1
R JavaFX Stage.close() funktioniert nicht im jar-File AWT, Swing, JavaFX & SWT 2
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
F CardLayout.show() funktioniert teilweise nicht AWT, Swing, JavaFX & SWT 5
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
D NachoCalendar - Show Tasks AWT, Swing, JavaFX & SWT 2
L CardLayout - Show klappt nicht AWT, Swing, JavaFX & SWT 7
F CardLayout.show() -> NullPointerException AWT, Swing, JavaFX & SWT 4
R Show/Hide eines JPanels mit TitledBorder. AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben