前情提要:
- 採用
primaryStage.initStyle(StageStyle.UNDECORATED);
去掉了系統自帶的標題欄 - 未自定義按鈕,而是直接採用了前端的最小化按鈕(前端執行的方法名稱是 winMin() )
- 將
StageStyle.UNDECORATED
改成StageStyle.TRANSPARENT
沒有用
重點來了:
stage.setIconified(true)
會生效的2種場景:
- 寫在
Application
的start()
方法中:
public class LoginApplication extends Application {
@Override
public void start(Stage stage) throws Exception {
stage.setIconified(true)
}
}
- 自定義一個
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