JavaFX2:从内部关闭一个阶段(子阶段)

Meg*_*Meg 9 user-interface javafx javafx-2

我是JavaFx的新手,我正在创建一个应用程序,并且需要类似于使用swing组件时提供的JDialog.我通过创建新舞台解决了这个问题,但现在我需要一种方法通过单击按钮从内部关闭新舞台.(是的,x按钮也能正常工作,但也希望它也能按下按钮).描述情况:我有一个主类,我用它创建一个带有场景的主舞台.我使用FXML.

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();
}
Run Code Online (Sandbox Code Playgroud)

现在在出现的主窗口中,我拥有所有控制项和菜单以及通过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();
}
Run Code Online (Sandbox Code Playgroud)

如图所示,About Box窗口是通过FXML再次创建的控件类.有一个图片,一个文本区域和一个按钮,我希望该按钮可以关闭AboutBox.java类中的aboutBox新阶段.

我发现自己能够做到这一点的唯一方法是定义一个公共静态舞台aboutBox; 在Builder.java类中,并在AboutBox.java中的那个方法中引用该方法,该方法处理关闭按钮上的动作事件.但不知何故,它感觉并不完全干净正确.有没有更好的方法?

提前感谢您的建议.

jew*_*sea 23

您可以从传递给事件处理程序的事件派生要关闭的阶段.

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 像这样关闭舞台绕过onCloseRequest事件处理程序(如果有的话).我会添加行stage.getOnCloseRequest().handle(null); 就在stage.close()之前 (8认同)