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

前情提要:

  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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章