Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX2.0主窗口关闭,尽管事件已被消耗_Java_Javafx 2 - Fatal编程技术网

JavaFX2.0主窗口关闭,尽管事件已被消耗

JavaFX2.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

如果有未保存的更改,我希望在用户单击窗口关闭控件(窗口框架中的“X”)后阻止我的应用程序(class
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位)。