2013-03-16 97 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