【问题标题】:JavaFX closing application modal dialogJavaFX 关闭应用程序模式对话框
【发布时间】:2013-07-24 20:15:18
【问题描述】:

我正在使用this 示例来创建应用程序模式对话框。当我单击对话框上的退出按钮(右上角的红色按钮)时,一切正常。对话框关闭,然后我可以正常打开它。但是当我尝试添加关闭我的对话框的Button 时,一切正常,直到我尝试重新打开它。之后,它会向我抛出 IllegalStateException(如果需要,我将使用此异常更新答案)。

这是一个演示如何关闭对话框的事件处理程序:

    btnClose.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            dialog.close();
        }
    });

谁能告诉我如何正确关闭应用程序模式对话框?提前致谢。

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    编辑

    我看到你发现了你的问题,我想我只是用示例代码保留我的答案,以防其他人有类似的问题。


    您的 btnClose 操作对我有用,因此问题可能出在您尚未发布的某些代码中。

    这是我为测试它而创建的示例:

    import javafx.application.Application;
    import javafx.event.*;
    import javafx.geometry.Pos;
    import javafx.scene.*;
    import javafx.scene.control.*;
    import javafx.scene.layout.*;
    import javafx.stage.*;
    
    public class DialogClosing extends Application {
        @Override public void start(final Stage stage) {
            final Button showDialog = new Button("Show Dialog");
            showDialog.setOnAction(new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent actionEvent) {
                    showDialog(stage, showDialog);
                }
            });
    
            StackPane layout = new StackPane();
            layout.getChildren().setAll(
                showDialog
            );
    
            layout.setStyle("-fx-padding: 10px;");
            stage.setScene(
                new Scene(
                    layout
                )
            );
            stage.show();
        }
    
        private Stage showDialog(Window parent, final Node showControlNode) {
            showControlNode.setDisable(true);
    
            final Stage dialog = new Stage();
            dialog.initOwner(parent);
            dialog.initStyle(StageStyle.UTILITY);
            dialog.setX(parent.getX());
            dialog.setY(parent.getY() + parent.getHeight());
    
            Button closeDialog = new Button("Close Dialog");
            closeDialog.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent actionEvent) {
                    dialog.close();
                }
            });
            dialog.setOnHidden(new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent windowEvent) {
                    showControlNode.setDisable(false);
                }
            });
    
            VBox layout = new VBox(10);
            layout.setAlignment(Pos.CENTER);
            layout.getChildren().addAll(
                new Label("Hello World!"),
                closeDialog
            );
            layout.setStyle("-fx-padding: 10px;");
    
            Scene scene = new Scene(
                layout,
                125,
                100
            );
    
            dialog.setScene(scene);
            dialog.show();
    
            return dialog;
        }
    
        public static void main(String[] args) { launch(args); }
    }
    

    【讨论】:

    • 感谢您的努力。是的,它在 Stage 未被声明为静态之前一直有效。
    【解决方案2】:

    好吧,没关系。事情解决了。对造成的不便表示歉意。问题是我将Stage 声明为静态的。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多