尽管消耗了事件,JavaFx 2.0主窗口仍会关闭

时间:2013-03-16 19:06:09

标签: java javafx-2

如果有未保存的更改,我想阻止我的应用程序(类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()退出,窗口就会关闭。 (应用程序的线程仍然在运行。)对于它的价值,应用程序只是一个存根:绘制场景,但没有菜单项或控件功能,它不会创建额外的线程等。

我错过了什么?

1 个答案:

答案 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);
    }
}