2012-07-13 90 views
5

我是JavaFx的新手,我正在創建一個應用程序,並且需要類似於使用swing組件提供的JDialog類似的東西。我通過創建新的舞臺來解決這個問題,但現在我需要一種方法來通過單擊按鈕來從內部關閉新舞臺。 (是的,x按鈕也可以工作,但也需要按鈕)。爲了描述情況: 我有一個主要的課程,我從中創建了一個場景的主要舞臺。我使用FXML。JavaFX2:從本身內部關閉一個階段(子階段)

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); 
    stage.setTitle("Ring of Power - Builder"); 
    stage.setScene(new Scene(root)); 
    stage.setMinHeight(600.0); 
    stage.setMinWidth(800.0); 
    stage.setHeight(600); 
    stage.setWidth(800); 
    stage.centerOnScreen(); 
    stage.show(); 
} 

現在出現我所有的控制項目和菜單之類的東西,通過FXML和適當的控制類所做的主窗口。這是我決定在幫助菜單中包含關於信息的部分。所以我有一個事件正在進行時的菜單幫助 - 被激活,就像這樣:

@FXML 
private void menuHelpAbout(ActionEvent event) throws IOException{ 
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); 
    Stage aboutBox=new Stage(); 
    aboutBox.setScene(new Scene(root2)); 
    aboutBox.centerOnScreen(); 
    aboutBox.setTitle("About Box"); 
    aboutBox.setResizable(false); 
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show(); 
} 

由於關於對話框窗口,通過與控制類FXML創建再看。有一張圖片,一個文本區域和一個按鈕,我希望這個按鈕可以從AboutBox.java類中關閉這個新的關於aboutBox的階段。

我發現自己能夠做到這一點的唯一方法是定義一個 public static Stage aboutBox; 在Builder.java類中,並且在處理關閉按鈕上的操作事件的方法中的AboutBox.java中引用該對象。但不知何故,它不覺得乾淨和正確。有沒有更好的方法?

在此先感謝您的建議。

回答

21

您可以從傳遞給事件處理函數的事件派生要關閉的階段。

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

像這樣關閉舞臺繞過onCloseRequest事件處理程序(如果有的話)。我會添加行stage.getOnCloseRequest()。handle(null);在stage.close()之前; – beardedlinuxgeek 2013-03-04 18:10:11

+1

謝謝@beardedlinuxgeek。我有這個問題 - 我的窗口正在關閉,但我註冊的事件處理程序沒有被調用。您的解決方案解決了問題。 – 2014-07-15 11:06:39

1

在JavaFX 2.1中,您有幾個選擇。像jewelsea的答案,或者你已經做了什麼,或者在菜單項的動作事件處理程序修改後的版本,它像

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 

與使用像

new AboutBox().show(); 

的方式的方式。

+0

實際上解決方案有點困難。它似乎不喜歡FXML的第一個版本。 – Meg 2012-07-21 14:36:06

+0

問題似乎是事實,您調用AboutBox.java類本身應該是AboutBox.fxml的控制類除非這是您爲什麼寫AboutPage.fxml < – Meg 2012-07-21 17:45:58

+0

@Meg的原因。更新了答案。 AboutBox.java不是AboutBox.fxml或AboutPage.fxml的控制器。 – 2012-07-21 19:53:53