TextInputDialog仅首次显示

时间:2016-06-20 19:27:21

标签: java javafx awt

请参阅下面的代码段:

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()){
        ...
      }
    })
  }
}

对话框只会显示一次。第二次或更多次actionPerformed()被触发,它不会弹出,也不会抛出任何异常。

我已尝试在Task上使用setOnSucceeded()Task,并根据Thread开始Task。更糟糕的是,对话框根本没有显示出来,而且没有出现错误。

1 个答案:

答案 0 :(得分:1)

您需要设置以下内容:

Platform.setImplicitExit(false);

否则JavaFX运行时将在您关闭最后一个窗口时关闭,因此Platform.runLater()仅适用于您的原因

来自Platform的片段:

  

将implicitExit属性设置为指定值。如果这   如果属性为true,则JavaFX运行时将隐式关闭   最后一个窗口关闭; JavaFX启动程序将调用   Application.stop()方法并终止JavaFX应用程序线程。   如果此属性为false,则应用程序将继续运行   通常甚至在最后一个窗口关闭后,直到应用程序   调用exit()。默认值为true。