2013-03-16 38 views
1

如果存在未保存的更改,我想阻止在用户单击窗口关闭控件(窗口框架中的'X')后关闭我的应用程序(类Foo)。以下和其他地方的提示,我有Foo实施EventHandler<WindowEvent>handle()方法查询控制器未保存的更改,如果发现任何更改,则使用该事件。结构如下所示。尽管事件正在被消耗,但JavaFx 2.0主窗口关闭

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()退出,窗口关闭。 (应用程序的线程仍在运行。)对于它的价值,应用程序仅仅是一个存根:场景被绘制,但没有任何菜单项或控件功能,它不会创建其他线程等。

我错过了什么?

回答

2

我刚写了一个小测试应用程序。消费该事件确实会阻止窗口关闭。看看你发布的代码,我不知道为什么它不适合你。莫非你

一)国家使用的是(System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());)和

B)运行下面的代码,并告诉我,这是否对你的作品的JavaFX的版本?

我想知道它是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); 
    } 
} 
+0

感谢您的回复。 JavaFX版本是2.2.7-b01。我运行你的代码,并得到一个空的阶段(除了通常的最小化/最大化/关闭按钮)。我点击关闭按钮,窗口关闭(但保持线程运行)。不知道它是否有所作为,但我在Linux Mint 14 Nadia(64位)上运行。 – prubin 2013-03-18 20:16:10