JavaFX关闭应用程序模式对话框

JavaFX关闭应用程序模式对话框,java,javafx-2,Java,Javafx 2,我使用这个示例来创建应用程序模式对话框。当我点击对话框上的退出按钮(右上角的红色按钮)时,一切正常。对话框关闭,然后我可以正常打开它。但是,当我尝试添加一个关闭对话框的按钮时,一切正常,直到我尝试重新打开它。之后,它会抛出一个非法状态异常(如果需要,我会用这个异常更新答案) 这是一个事件处理程序,演示如何关闭对话框: btnClose.setOnAction(new EventHandler<ActionEvent>() { @Override

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

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

    btnClose.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            dialog.close();
        }
    });
btnClose.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
dialog.close();
}
});

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

好的,没关系。事情解决了。很抱歉给您带来不便。问题是我将我的
阶段声明为静态。

好的,不用担心。事情解决了。很抱歉给您带来不便。问题是我将我的
阶段声明为静态。

编辑

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


你的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); }
}
导入javafx.application.application;
导入javafx.event.*;
导入javafx.geometry.Pos;
导入javafx.scene.*;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.stage.*;
公共类对话框关闭扩展了应用程序{
@覆盖公共无效开始(最后阶段){
最终按钮显示对话框=新按钮(“显示对话框”);
showDialog.setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent ActionEvent){
showDialog(舞台,showDialog);
}
});
StackPane布局=新建StackPane();
layout.getChildren().setAll(
显示对话框
);
布局。设置样式(“-fx填充:10px;”);
第二阶段(
新景(
布局
)
);
stage.show();
}
专用阶段显示对话框(窗口父节点、最终节点showControlNode){
showControlNode.setDisable(true);
最终阶段对话框=新阶段();
dialog.initOwner(父级);
initStyle(StageStyle.UTILITY);
setX(parent.getX());
setY(parent.getY()+parent.getHeight());
按钮关闭对话框=新按钮(“关闭对话框”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent ActionEvent){
dialog.close();
}
});
setOnHidden(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent WindowEvent){
showControlNode.setDisable(false);
}
});
VBox布局=新的VBox(10);
布局。设置对齐(位置中心);
layout.getChildren().addAll(
新标签(“你好,世界!”),
关闭对话框
);
布局。设置样式(“-fx填充:10px;”);
场景=新场景(
布局,
125,
100
);
dialog.setScene(场景);
dialog.show();
返回对话框;
}
公共静态void main(字符串[]args){launch(args);}
}
编辑

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


你的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); }
}
导入javafx.application.application;
导入javafx.event.*;
导入javafx.geometry.Pos;
导入javafx.scene.*;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.stage.*;
公共类对话框关闭扩展了应用程序{
@覆盖公共无效开始(最后阶段){
最终按钮显示对话框=新按钮(“显示对话框”);
showDialog.setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent ActionEvent){
showDialog(舞台,showDialog);
}
});
StackPane布局=新建StackPane();
layout.getChildren().setAll(
显示对话框
);
布局。设置样式(“-fx填充:10px;”);
第二阶段(
新景(
布局
)
);
stage.show();
}
专用阶段显示对话框(窗口父节点、最终节点showControlNode){
showControlNode.setDisable(true);
最终阶段对话框=新阶段();
dialog.initOwner(父级);
initStyle(StageStyle.UTILITY);
setX(parent.getX());
setY(parent.getY()+parent.getHeight());
按钮关闭对话框=新按钮(“关闭对话框”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent ActionEvent){
dialog.close();
}
});
setOnHidden(新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent WindowEvent){
showControlNode.setDisable(false);
}
});
VBox布局=新的VBox(10);
布局。设置对齐(位置中心);
layout.getChildren().addAll(
新标签(“你好,世界!”),
关闭对话框
);
布局。设置样式(“-fx填充:10px;”);
场景=新场景(
布局,
125,
100
);
dialog.setScene(场景);
dialog.show();
返回对话框;
}
公共静态void main(字符串[]args){launch(args);}
}

谢谢你的努力。是的,它会一直工作到阶段未声明为静态。感谢您的努力。是的,它在联合国起作用