【发布时间】:2021-08-27 13:12:28
【问题描述】:
我有一个 javafx 应用程序,我需要在运行时显示/编辑/操作一些对象。 例如我有一个anchorPane,当我单击一个按钮时,我需要将窗格设置为可见,并且在执行逻辑期间,将一些标签设置为可见。
这是我的代码:
//MyController.java
public class MyController extends AnchorPane {
@FXML
private AnchorPane myPane;
@FXML
private Label label1;
@FXML
private Label label2;
@FXML
private Button button1;
private Main application;
public void setApp(Main application) {
this.application = application;
}
public void initialize()
{
myButton.setOnAction(new EventHandler<ActionEvent>()
{
@override
public void handle(ActionEvent arg0)
{
myPane.setVisile(true);.
//long run action
label1.setVisible(true);
//long run action
label2.setVisibile(true);
//long run action
button1.setText("myText");
//long run action
button1.setVisibile(true);
//end of operations
}
)};
}
}
我不明白为什么 GUI 冻结和所有元素在操作结束时一起显示,我试图查看有关 javafx 线程管理的一些内容,但我无法实现令人满意的解决方案.. 有人可以帮助我吗?
谢谢大家。
【问题讨论】:
-
您正在应用程序线程上进行更改,该线程在应用程序运行时暂停应用程序更新(冻结应用程序)尝试将您的更改包装在
Platform.runLater(()-> ... ) -
我试过这个解决方案,不幸的是不起作用。
-
你能不能发布一个完整的可运行的minimal reproducible example 然后去掉代码,这样它就没有任何我们不需要重现问题的额外代码
-
您不能在事件处理程序中执行长时间运行的操作。在您的处理程序返回之前,UI 无法重绘自身(或响应用户输入)。这就是它结冰的原因。您需要在不同的线程中执行长时间运行的操作,然后像 Matt 建议的那样使用 Platform.runLater,或者在由 Service 创建的任务中执行这些操作。
标签: java multithreading user-interface javafx interface