利用JavaFx开发RIA桌面应用-Stage窗口关闭监听,并弹出确认提示框

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/53737969,建议读者阅读原文,确保获得完整的信息

1 场景说明

       JavaFx开发的桌面客户端,如果没自定义标题栏,使用其默认的风格(即包含最小化、最大化、关闭图标),其中往往需要调整的是关闭方式,不希望是直接关闭,而是弹出确认提示框,如下图:

利用JavaFx开发RIA桌面应用-Stage窗口关闭监听,并弹出确认提示框_第1张图片

2 实现方式

       这里给大家介绍一种比较简洁的实现方式,还是沿用JavaFx默认的标题栏,只不过在处理环节中加入其它元素。

       总体分为3步:

  • 第一步:构建弹出窗口模版,即窗口类。
  • 第二步:创建窗口关闭处理事件,即关闭按钮点击后,如何处理逻辑。
  • 第三步:窗口关闭按钮添加监听器。

       第一步,创建弹出窗口类,显示效果如上图中的小窗口,至于风格因人而异。

public class WindowsClosePage {

    private static final Logger logger = Logger.getLogger(WindowsClosePage.class);

    private Stage dialogStage;
    private Stage primaryStage;

    public WindowsClosePage(Stage stage) {

        MyStyleButton myStyleButton = MyStyleButton.getInstance();

        WindowsPositionObject windowsPosition = WindowsPositionObject.getInstance();
        double width = windowsPosition.getLength()/2;
        double height = windowsPosition.getWidth()/2;

        dialogStage = new Stage();
        primaryStage = stage;

        dialogStage.initOwner(primaryStage);

        dialogStage.initModality(Modality.WINDOW_MODAL);
        dialogStage.setWidth(width);
        dialogStage.setHeight(height);
        dialogStage.setX(windowsPosition.getX() + width/2);
        dialogStage.setY(windowsPosition.getY() + height/2);
        dialogStage.setResizable(false);

        BorderPane borderPaneLayout = new BorderPane();
        borderPaneLayout.getStyleClass().add("root");

        Button confirm = myStyleButton.getShadowButton("是(Y)", ImageUtil.getImageView("image/ok.png"));
        Button cancel = myStyleButton.getShadowButton("否(N)", ImageUtil.getImageView("image/close.png"));

        confirm.setOnMouseClicked(new EventHandler() {
            public void handle(MouseEvent event) {
                dialogStage.close();
                primaryStage.close();
            }
        });

        cancel.setOnMouseClicked(new EventHandler() {
            public void handle(MouseEvent event) {
                dialogStage.close();
            }
        });

        HBox hBox = new HBox();
        hBox.setSpacing(10);
        hBox.getChildren().addAll(confirm,cancel);
        hBox.setAlignment(Pos.CENTER);

        VBox vBox = new VBox();
        Text text = new Text(Constant.CLOSE_PAGE_TITLE);
        vBox.setSpacing(40);
        vBox.getChildren().addAll(text,hBox);
        vBox.setAlignment(Pos.CENTER);

        borderPaneLayout.setCenter(vBox);

        Scene scene = new Scene(borderPaneLayout);
        dialogStage.setTitle(Constant.SOFTWARE_TITLE);
        dialogStage.setScene(scene);

        logger.info("WindowsClosePage UI");
    }

    public void activateProgressBar() {
        dialogStage.show();
    }
}

       第二步,创建窗口关闭监听事件类,此事件类主要就是实现窗口关闭按钮被电击后的连串事件。看见方法中使用了event.consume()方法,然后再调出了弹出小窗口。

public class WindowsCloseEvent implements EventHandler<WindowEvent> {

    private Stage stage;

    public WindowsCloseEvent(Stage stage){
        this.stage = stage;
    }

    public void handle(WindowEvent event) {

        event.consume();

        WindowsClosePage windowsClosePage = new WindowsClosePage(stage);
        windowsClosePage.activateProgressBar();
    }
}

       如果要阻止窗口在按下关闭按钮后退出,需要利用setOnCloseRequest,同时在handler函数中需要调用event.consume()来阻止事件进一步传递,这样才能真正阻止Window Close事件的默认处理,可以通过API来了解:

这里写图片描述

       其中属性描述中有明确的说明,可以通过consuming来阻止窗口被关闭,详见:http://docs.oracle.com/javafx/2/api/javafx/stage/Window.html#onCloseRequestProperty

第三步,在程序入口类的start函数中添加stage关闭监听。

public void start(Stage primaryStage){
    ...
    primaryStage.setOnCloseRequest(new WindowsCloseEvent(primaryStage));
    }
    ...

3 补充说明

3.1. stage.hide() 与 stage.close() 等价。
详见http://docs.oracle.com/javafx/2/api/javafx/stage/Stage.html#close()

3.2. 如果要阻止Fx窗口在按下关闭按钮后退出,的确需要setOnCloseRequest,可是在handler函数中需要调用event.consume()来阻止事件进一步传递,这样才能真正阻止Window Close事件的默认处理,如果不加这个方法,窗口是会直接关闭的。
详见http://docs.oracle.com/javafx/2/api/javafx/stage/Window.html#onCloseRequestProperty

3.3. 默认情况下,JavaFx运行时会在最后一个stage close(或hide)后自动关闭,即自动调用Application.stop(),除非通过Platform.setImplicitExit(false)取消这个默认行为。这样,即使所有Fx窗口关闭(或隐藏),Fx运行时还在正常运行,可以再次显示原来的窗口或打开新的窗口。
详见http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#setImplicitExit(boolean)

相关文章:

  • 《 利用JavaFx开发RIA桌面应用-Stage窗口关闭监听,并弹出确认提示框》
  • 《 利用JavaFx开发RIA桌面应用-Windows任务栏图标闪烁效果》
  • 《 利用JavaFx开发RIA桌面应用-TableView操作》
  • 《 利用JavaFx开发RIA桌面应用-Clipboard剪贴板操作》
  • 《利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框》
  • 《利用JavaFx开发RIA桌面应用-半透明界面设计》
  • 《利用JavaFx开发RIA桌面应用-加载等待界面设计》
  • 《利用JavaFx开发RIA桌面应用-文件拖拽》
  • 《利用JavaFx开发RIA桌面应用-改变stage的标题栏的图标》
  • 《利用JavaFx开发RIA桌面应用-事件监听》
  • 《利用JavaFx开发RIA桌面应用-ComboBox组合编辑框水平增长》
  • 《利用JavaFx开发RIA桌面应用-布局说明》
  • 《利用JavaFx开发RIA桌面应用-在线资料》

你可能感兴趣的:(JavaFX,JAVA)