如果有未保存的更改,我想阻止我的应用程序(类Foo
)在用户单击窗口关闭控件(窗口框中的“X”)后关闭。根据此处和其他地方的提示,我Foo
实施EventHandler<WindowEvent>
。 handle()
方法向控制器查询未保存的更改,如果发现任何更改,则使用该事件。结构如下:
public class Foo extends Application implements EventHandler<WindowEvent> {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Foo.fxml"));
Parent root = (Parent) loader.load();
controller = (FooController) loader.getController();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setOnCloseRequest(this); // handle window close requests
stage.show();
}
@Override
public void handle(WindowEvent t) {
if (t.getEventType() == WindowEvent.WINDOW_CLOSE_REQUEST) {
if (controller.isDirty()) {
t.consume();
}
}
}
}
使用print语句和调试器,我确认处理程序触发并且事件被消耗。我还确认永远不会调用Application.stop()
方法。尽管如此,只要handle()
退出,窗口就会关闭。 (应用程序的线程仍然在运行。)对于它的价值,应用程序只是一个存根:绘制场景,但没有菜单项或控件功能,它不会创建额外的线程等。
我错过了什么?
答案 0 :(得分:2)
我刚写了一个小测试应用程序。使用该事件确实会阻止窗口关闭。看看你发布的代码,我不知道它为什么不适合你。你能
吗? a)说明您正在使用的JavaFX版本(System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
)和
b)运行下面的代码并告诉我这是否适合您?
我正在试图找出它是否是JavaFX中的错误或应用程序中的一些副作用。
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
public class Test extends Application {
@Override
public void start(final Stage stage) throws Exception {
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(final WindowEvent windowEvent) {
windowEvent.consume();
}
});
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}