我有一个简单的未经修饰的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);
}
}
我在这里找到了其他一些答案,这些答案涉及具有取消按钮的Alert
和Dialog
窗格,但是我的Alert
根本没有按钮。它只是在后台任务运行时显示一条消息。
根据Dialog
上的JavaDocs结束规则:
JavaFX对话框只能在“异常”(如上定义)中关闭 两种情况:
- 对话框只有一个按钮时,或者
- 当对话框具有多个按钮时,只要其中一个按钮满足以下要求之一:
- 该按钮具有一个ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE。
- 该按钮具有一个ButtonType,当调用ButtonBar.ButtonData.isCancelButton()时,其ButtonBar.ButtonData返回true。
在所有其他情况下,对话框将拒绝响应所有 关闭请求,保持打开状态,直到用户单击其中一个 对话框的DialogPane区域中的可用按钮。
所以这也表明应该接受简单的close()
请求,因为Alert(AlertStyle.NONE)
中没有合格按钮,对吗?
答案 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();