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

Javafx 在runLater中关闭不带按钮的现有警报,javafx,dialog,javafx-8,observable,Javafx,Dialog,Javafx 8,Observable,我希望我的应用程序打开一个用户无法关闭的对话框,但当他的手机重新连接时它会关闭(他对打开的对话框很耐心) 我当前正在使用Platform.runlater打开警报对话框,如下所示: phoneConnected.getObservable().addListener(observable -> { LOG.info("identifyObs " + phoneConnected.getBooleanDataValue().getValue()); if (phone

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

我当前正在使用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());
      }
    });
事实上,当可观察对象变为“true”时,我在控制台中得到了“ok”,但对话框没有关闭

我试过用runLater,用runLater,有什么想法吗


我想说的是,我已经看到了这一点:但它不起作用。

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

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();
});

对就是这样,我只需要代码中的“alert.setResult(buttonype.OK);”就可以了,它现在就像一个符咒一样工作了!隐马尔可夫模型。。。听起来像是一个bug(?)-或者我们可以想象任何需要/需要这种行为的用例吗?好的,我想我理解逻辑:a)编程关闭与通过窗口按钮关闭处于同一“异常”类别b)dialog.close的api doc指定允许实际关闭异常关闭的规则。即i)只有一个按钮或ii)有多个按钮,其中一个是取消关闭。AlertType.NONE没有按钮,因此它会出现(在fxDialog.permissionToClose的实现中看到的未指定)特殊情况,即结果必须是!=无效的你找到了一个完美的解决方法:)