JavaFX2.0主窗口关闭,尽管事件已被消耗
如果有未保存的更改,我希望在用户单击窗口关闭控件(窗口框架中的“X”)后阻止我的应用程序(classJavaFX2.0主窗口关闭,尽管事件已被消耗,java,javafx-2,Java,Javafx 2,如果有未保存的更改,我希望在用户单击窗口关闭控件(窗口框架中的“X”)后阻止我的应用程序(classFoo)关闭。在这里和其他地方,我有Foo实现EventHandler。handle()方法查询控制器是否有未保存的更改,如果发现任何更改,则使用事件。结构如下所示 public class Foo extends Application implements EventHandler<WindowEvent> { @Override public void start(St
Foo
)关闭。在这里和其他地方,我有Foo
实现EventHandler
。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();
}
}
}
}
公共类Foo扩展应用程序实现EventHandler{
@凌驾
public void start(Stage)引发异常{
FXMLLoader=newFXMLLoader(getClass().getResource(“Foo.fxml”);
父根=(父)加载程序。加载();
controller=(FooController)loader.getController();
场景=新场景(根);
舞台场景;
stage.setOnCloseRequest(this);//处理窗口关闭请求
stage.show();
}
@凌驾
公共无效句柄(WindowEvent t){
if(t.getEventType()==WindowEvent.WINDOW\u关闭请求){
if(controller.isDirty()){
t、 消费();
}
}
}
}
使用print语句和调试器,我确认处理程序已启动,事件已被使用。我还确认从未调用Application.stop()
方法。尽管如此,只要handle()
退出,窗口就会关闭。(但应用程序的线程仍在运行。)值得一提的是,应用程序只是一个存根:绘制了场景,但没有菜单项或控件功能,也没有创建其他线程,等等
我遗漏了什么?我刚刚编写了一个小测试应用程序。使用事件不会阻止窗口关闭。看看你发布的代码,我不知道为什么它不适合你。你能吗 a) 说明您正在使用的JavaFX版本(
System.out.println(com.sun.JavaFX.runtime.VersionInfo.getRuntimeVersion());
)和
b) 运行下面的代码,告诉我这是否适用于您
我试图找出这是JavaFX中的一个bug还是应用程序中的一些副作用
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);
}
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.stage.stage;
导入javafx.stage.WindowEvent;
公共类测试扩展了应用程序{
@凌驾
public void start(final Stage)引发异常{
stage.setOnCloseRequest(新的EventHandler(){
公共无效句柄(最终WindowEvent WindowEvent){
windowEvent.consume();
}
});
stage.show();
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
}
感谢您的回复。JavaFX版本是2.2.7-b01。我运行了你的代码,得到了一个空的阶段(除了通常的最小化/最大化/关闭按钮)。我点击了close按钮,窗口关闭了(但线程仍在运行)。我不知道这是否会有所不同,但我运行的是LinuxMint14Nadia(64位)。