Javafx 在runLater中关闭不带按钮的现有警报
我希望我的应用程序打开一个用户无法关闭的对话框,但当他的手机重新连接时它会关闭(他对打开的对话框很耐心) 我当前正在使用Platform.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
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的实现中看到的未指定)特殊情况,即结果必须是!=无效的你找到了一个完美的解决方法:)