在runLater中关闭不带按钮的现有警报

时间:2018-03-19 10:35:28

标签: javafx dialog javafx-8 observable

我希望我的应用程序打开一个用户无法关闭的对话框,但是当他的手机重新连接时它会关闭(他对打开的对话框很耐心)

我目前正在使用Platform.runlater打开警告对话框,如下所示:

phoneConnected.getObservable().addListener(observable -> {
      LOG.info("identifyObs " + phoneConnected.getBooleanDataValue().getValue());
      if (phoneConnected.getBooleanDataValue() != null && !phoneConnected.getBooleanDataValue().getValue()) {
        Platform.runLater(() -> alert.show());
      }
      if (phoneConnected.getBooleanDataValue().getValue()) {
        System.out.println("ok");
        alert.close();
        Platform.runLater(() -> alert.close());
      }
    });

事实是,当观察者要去"真实"时,我已经得到了" ok"在控制台中,但对话框没有关闭..

我已经在runLater中试过了runLater,有什么想法吗?

我想说,我已经看到了这一点:Javafx: Close alert box (or, any dialog box) programatically但它无法正常工作..

1 个答案:

答案 0 :(得分:2)

如果未设置结果并且没有可用的按钮,则Alert似乎无法正常关闭。您可以通过分配任意ButtonType作为结果来解决此问题:

Alert alert = new Alert(Alert.AlertType.NONE, "wait for it");

// set result to allow programmatic closing of alert
alert.setResult(ButtonType.OK);

Button btn = new Button("Start");
btn.setOnAction(evt -> {
    btn.setDisable(true);

    // make alert appear / disappear
    Thread t = new Thread(() -> {
        boolean showing = false;
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(NewFXMain2.class.getName()).log(Level.SEVERE, null, ex);
            }
            Runnable action = showing ? alert::close : alert::show;
            Platform.runLater(action);
            showing = !showing;
        }
    });
    t.setDaemon(true);
    t.start();
});