我是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();
}
现在在出现的主窗口中,我有通过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();
}
如图所示,About Box窗口是通过FXML再次创建的控件类。有一个图片,一个文本区域和一个按钮,我希望该按钮可以关闭AboutBox.java类中的aboutBox这个新阶段。
我发现自己能够做到这一点的唯一方法是定义一个 public static Stage aboutBox; 在Builder.java类中,并在AboutBox.java中的那个方法中引用该方法,该方法处理关闭按钮上的动作事件。但不知何故,它感觉并不完全干净正确。还有更好的办法吗?
提前感谢您的建议。
答案 0 :(得分:22)
您可以从传递给事件处理程序的事件派生要关闭的阶段。
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();
}
}
答案 1 :(得分: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();
在菜单项操作事件处理程序中。