2016-06-20 9 views
0

unten, um den Code-Schnipsel Siehe:TextInputDialog nur zum ersten Mal gezeigt

public class Application extends javafx.application.Application implements ActionListener { 

    private java.awt.SystemTray tray; 
    private java.awt.TrayIcon trayIcon; 
    private java.awt.PopupMenu popupMenu = new PopupMenu(); 
    private java.awt.MenuItem menuItem = new MenuItem("My Item"); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
    if (!SystemTray.isSupported()) 
     return; 

    menuItem.addActionListener(this); 
    popupMenu.add(menuItem); 

    trayIcon = new TrayIcon(image, "Title", popupMenu); 
    tray = SystemTray.getSystemTray(); 
    tray.add(trayIcon); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e){ 
    Platform.runLater(() -> { 
     Optional<String> result = new TextInputDialog().showAndWait(); 
     if(result.isPresent() && !result.get().isEmpty()){ 
     ... 
     } 
    }) 
    } 
} 

Was ist der Dialog nur einmal passiert ist, zeigen wird. Die zweite oder mehrere Male actionPerformed() wird ausgelöst, es wird nicht angezeigt und keine Ausnahme ausgelöst.

Ich habe versucht, mit Task, setOnSucceeded() an diesen Task, und starten Sie ein Thread auf der Grundlage dieser Task. Schlimmer noch, der Dialog wird überhaupt nicht angezeigt und auch hier wird kein Fehler erzeugt.

+0

Können Sie Ihre Importe zeigen? Das macht keinen Sinn: Sie befinden sich in einer JavaFX-Anwendung, registrieren aber einen 'ActionListener'? –

+0

@James_D Sie haben Recht, sowohl 'MenuItem' als auch' ActionListener' stammen von java.awt. Ich weiß, dass es nicht so sein sollte, aber JavaFX implementiert noch kein plattformübergreifendes SystemTray wie AWT. –

+0

Können Sie Ihr Beispiel zu einem [MCVE] machen? –

Antwort

1

Sie müssen die folgenden Einstellungen:

Platform.setImplicitExit(false); 

Andernfalls wird die JavaFX-Laufzeit wird heruntergefahren, wenn Sie Ihr letztes Fenster zu schließen, also warum Platform.runLater() funktioniert nur einmal für Sie

Snippet von Platform:

Legt das impliziteExit-Attribut auf den angegebenen Wert fest. Wenn dieses Attribut wahr ist, wird die JavaFX-Laufzeit implizit beendet, wenn das letzte Fenster geschlossen wird; Der JavaFX-Launcher ruft die Application.stop() -Methode auf und beendet den JavaFX-Anwendungs-Thread. Wenn dieses Attribut false ist, wird die Anwendung weiterhin normal ausgeführt, auch nachdem das letzte Fenster geschlossen wurde, bis die Anwendung exit() aufruft. Der Standardwert ist wahr.

+0

Das habe ich auch herausgefunden. Beachten Sie, dass die AWT auch auf dem AWT Event Dispatch Thread mit 'SwingUtilities.invokeLater (...)' ausgeführt werden sollte (Es scheint zumindest auf meinem System zu funktionieren, aber es bricht die AWT-Threading-Regeln.) –

+0

funktioniert als erwartet, danke Jungs! –