2012-11-26 192 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); 
} 

会为你做诡计。