2012-11-26 191 views
31

我需要通過代碼控制接近FXML窗口,JavaFX的

我知道stage.close()或stage.hide(關閉當前窗口FXML)爲此在FX

如何在fxml中實現這個?我試過

private void on_btnClose_clicked(ActionEvent actionEvent) { 
     Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));  
     Scene scene = new Scene(root); 

     Stage stage = new Stage();    
     stage.setScene(scene); 
     stage.show(); 
} 

但它不起作用!

所有幫助將不勝感激。謝謝!

回答

102
  1. 給你的關閉按鈕的外匯:身份證,如果你還沒有:<Button fx:id="closeButton" onAction="#closeButtonAction">
  2. 在你的控制器類:

    @FXML private javafx.scene.control.Button closeButton; 
    
    @FXML 
    private void closeButtonAction(){ 
        // get a handle to the stage 
        Stage stage = (Stage) closeButton.getScene().getWindow(); 
        // do what you have to do 
        stage.close(); 
    } 
    
+3

這種方法不適合我。我收到一個'NullPointerException' –

+0

令人驚歎的作品! ,以防萬一,人們記得檢查您的Button的名稱(這種情況下closeButton)和您的onClick的名稱(這種情況下closeButtonAction) –

+0

它只關閉窗口,但應用程序仍在運行! –

1

我不知道這是否是最好的方式(或者工作),但你可以嘗試:

private void on_btnClose_clicked(ActionEvent actionEvent) { 

     Window window = getScene().getWindow(); 

     if (window instanceof Stage){ 
      ((Stage) window).close(); 
     } 
} 

(假設你的控制器是一個節點,否則,你必須先得到該節點。 (getScene()爲節點的方法)

13

如果您有一個擴展javafx.application.Application;的窗口,可以使用以下方法。

Platform.exit(); 

實施例:

public class MainGUI extends Application { 
......... 

Button exitButton = new Button("Exit"); 
exitButton.setOnAction(new ExitButtonListener()); 
......... 

public class ExitButtonListener implements EventHandler<ActionEvent> { 

    @Override 
    public void handle(ActionEvent arg0) { 
    Platform.exit(); 
    } 
} 

編輯爲Java 8的美容:

public class MainGUI extends Application { 
    ......... 

    Button exitButton = new Button("Exit"); 
    exitButton.setOnAction(actionEvent -> Platform.exit()); 
} 
+0

'Platform.exit()'將關閉所有階段並擊落整個應用程序。這可能不希望。 – nonybrighto

+0

原始海報問如何關閉一個窗口(舞臺),而不是應用程序。 –

0
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    public void handle(WindowEvent we) {       
     Platform.setImplicitExit(false) 
      stage.close() 
     } 
    }); 

它等同於hide。所以當你下次打開它時,你只需檢查stage對象是否退出。如果退出,您只需撥打show()(stage.show())。否則,你必須開始舞臺。

4

我從接受的答案中收到NullPointerException後,通過以下方式實現此功能。

在我FXML:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel"> 

在我Controller類:

@FXML public void onMouseClickedCancelBtn(InputEvent e) { 
    final Node source = (Node) e.getSource(); 
    final Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
} 
1

我找到了一個很好的解決方案,並不需要一個事件來觸發:

@FXML 
private Button cancelButton; 

close(new Event(cancelButton, stage, null)); 

@FXML 
private void close(Event event) { 
    ((Node)(event.getSource())).getScene().getWindow().hide();      
} 
0

你可以簡單地實現這一點,

@FXML 
private void closeAction(ActionEvent evt){ 
    System.exit(0); 
} 

會爲你做詭計。