0

如果有未保存的更改,我想阻止我的应用程序(类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();
      }
    }
  }
}

使用打印语句和调试器,我确认处理程序触发并且事件被消耗。我还确认该Application.stop()方法永远不会被调用。尽管如此,一旦handle()退出,窗口就会关闭。(不过,应用程序的线程仍在运行。)对于它的价值,应用程序只是一个存根:绘制了场景,但没有菜单项或控件功能,它没有创建额外的线程等。

我错过了什么?

4

1 回答 1

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);
    }
}
于 2013-03-17T13:09:57.623 回答