未经装饰的警报将不会在被请求时关闭

时间:2018-08-16 22:11:50

标签: javafx alert

我有一个简单的未经修饰的Alert,我正在尝试在后台完成长时间运行的任务时显示。

但是,当任务完成时,我想关闭警报。但是,我无法通过调用close()hide()来关闭警报。

此MCVE不包括背景Task,但即使这样也拒绝关闭警报:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class AlertClosing extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Alert simpleAlert = new Alert(Alert.AlertType.NONE);

        simpleAlert.setContentText("Testing");
        simpleAlert.initStyle(StageStyle.UNDECORATED);

        simpleAlert.show();

        // None of these seem to have any effect.
        simpleAlert.close();
        simpleAlert.hide();
        Platform.runLater(simpleAlert::close);
    }
}

我在这里找到了其他一些答案,这些答案涉及具有取消按钮的AlertDialog窗格,但是我的Alert根本没有按钮。它只是在后台任务运行时显示一条消息。

根据Dialog上的JavaDocs结束规则:

  

JavaFX对话框只能在“异常”(如上定义)中关闭   两种情况:

     
      
  • 对话框只有一个按钮时,或者
  •   
  • 当对话框具有多个按钮时,只要其中一个按钮满足以下要求之一:      
        
    • 该按钮具有一个ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE。
    •   
    • 该按钮具有一个ButtonType,当调用ButtonBar.ButtonData.isCancelButton()时,其ButtonBar.ButtonData返回true。
    •   
  •   
     

在所有其他情况下,对话框将拒绝响应所有   关闭请求,保持打开状态,直到用户单击其中一个   对话框的DialogPane区域中的可用按钮。

所以这也表明应该接受简单的close()请求,因为Alert(AlertStyle.NONE)中没有合格按钮,对吗?

1 个答案:

答案 0 :(得分:1)

根据Javadoc的不同意,不接受关闭请求:既没有一个按钮,也没有多个按钮。

您可以分配一个ButtonType,以使Alert正确关闭。

Alert simpleAlert = new Alert(Alert.AlertType.NONE);

simpleAlert.setContentText("Testing");
simpleAlert.initStyle(StageStyle.UNDECORATED);

simpleAlert.show();

new Thread(() -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException ex) {
    }
    Platform.runLater(() -> {
        simpleAlert.setResult(ButtonType.CANCEL);
        simpleAlert.close();
    });
}).start();