UDN-企业互联网技术人气社区

板块导航

浏览  : 3928
回复  : 0

[讨论交流] 用JavaFx开发RIA桌面应用-Stage窗口关闭监听,并弹出确认提...

[复制链接]
htmlman的头像 楼主
  1 场景说明
1.png
  JavaFx开发的桌面客户端,如果没自定义标题栏,使用其默认的风格(即包含最小化、最大化、关闭图标),其中往往需要调整的是关闭方式,不希望是直接关闭,而是弹出确认提示框,如下图:

  2 实现方式

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

  总体分为3步:

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

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

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

  3.     private Stage dialogStage;
  4.     private Stage primaryStage;

  5.     public WindowsClosePage(Stage stage) {

  6.         MyStyleButton myStyleButton = MyStyleButton.getInstance();

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

  10.         dialogStage = new Stage();
  11.         primaryStage = stage;

  12.         dialogStage.initOwner(primaryStage);

  13.         dialogStage.initModality(Modality.WINDOW_MODAL);
  14.         dialogStage.setWidth(width);
  15.         dialogStage.setHeight(height);
  16.         dialogStage.setX(windowsPosition.getX() + width/2);
  17.         dialogStage.setY(windowsPosition.getY() + height/2);
  18.         dialogStage.setResizable(false);

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

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

  23.         confirm.setOnMouseClicked(new EventHandler<MouseEvent>() {
  24.             public void handle(MouseEvent event) {
  25.                 dialogStage.close();
  26.                 primaryStage.close();
  27.             }
  28.         });

  29.         cancel.setOnMouseClicked(new EventHandler<MouseEvent>() {
  30.             public void handle(MouseEvent event) {
  31.                 dialogStage.close();
  32.             }
  33.         });

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

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

  43.         borderPaneLayout.setCenter(vBox);

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

  47.         logger.info("WindowsClosePage UI");
  48.     }

  49.     public void activateProgressBar() {
  50.         dialogStage.show();
  51.     }
  52. }
复制代码

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

  2.     private Stage stage;

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

  6.     public void handle(WindowEvent event) {

  7.         event.consume();

  8.         WindowsClosePage windowsClosePage = new WindowsClosePage(stage);
  9.         windowsClosePage.activateProgressBar();
  10.     }
  11. }
复制代码

  如果要阻止窗口在按下关闭按钮后退出,需要利用setOnCloseRequest,同时在handler函数中需要调用event.consume()来阻止事件进一步传递,这样才能真正阻止Window Close事件的默认处理,可以通过API来了解:
1.png
  其中属性描述中有明确的说明,可以通过consuming来阻止窗口被关闭,详见: http://docs.oracle.com/javafx/2/api/javafx/stage/Window.html#onCloseRequestProperty

  第三步,在程序入口类的start函数中添加stage关闭监听。
  1. public void start(Stage primaryStage){
  2.     ...
  3.     primaryStage.setOnCloseRequest(new WindowsCloseEvent(primaryStage));
  4.     }
  5.     ...
复制代码

  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)

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部