前情提要:
- 采用
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

博客围绕JavaFX开发展开,提到去掉系统自带标题栏,采用前端最小化按钮。介绍了代码生效的2种场景,且必须手动点击按钮,触发点击事件无效。最后给出解决办法,在代码中使用Platform.runLater()方法,保证JavaFX代码运行在UI线程。
122

被折叠的 条评论
为什么被折叠?



