javafx stage.setIconified(true)最小化失效

博客围绕JavaFX开发展开,提到去掉系统自带标题栏,采用前端最小化按钮。介绍了代码生效的2种场景,且必须手动点击按钮,触发点击事件无效。最后给出解决办法,在代码中使用Platform.runLater()方法,保证JavaFX代码运行在UI线程。
前情提要:
  1. 采用primaryStage.initStyle(StageStyle.UNDECORATED); 去掉了系统自带的标题栏
  2. 未自定义按钮,而是直接采用了前端的最小化按钮(前端执行的方法名称是 winMin() )
  3. StageStyle.UNDECORATED改成 StageStyle.TRANSPARENT没有用
重点来了:

stage.setIconified(true)会生效的2种场景:

  1. 写在Applicationstart()方法中:
   public class LoginApplication extends Application {
       @Override
       public void start(Stage stage) throws Exception {
   	       stage.setIconified(true)
       }
   }
  1. 自定义一个Button , 监听点击事件:
   Button button  = new Button("最小化按钮");
   button.setOnAction(event -> {
      stage.setIconified(true);  
   });
   root.getChildren().add(button);

但前提是必须手动点击按钮, 使用 button.fire() 触发点击事件无效:

  Button button;
  void init(){
        button = new Button("最小化按钮");
        button.setOnAction(event -> {
             log.info(this.getClass().getName+":点击了按钮");  //打印了该段文字
             stage.setIconified(true);       //但是不生效
        });
        root.getChildren().add(button);
  }

  public void winMin(){
       button.fire();      //代码触发点击事件
  }

在这2种方法之外使用,怎么也不生效:例如

   public void winMin(){
      stage.setIconifized(true);
   }

那么该怎么办呢?

王牌来了:

在你的代码加上 Platform.runLater:

   public static void winMin() {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                stage.setIconified(true);
            }
        });
    }

需要使用Platform.runLater()方法,来保证JavaFX的代码运行在UI线程中。
纪念下人生第一个 stackflow: https://stackoverflow.com/questions/49196152/how-do-i-interact-with-my-primarystage-in-javafx-class-from-another-method

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值