java - 如何从按钮操作中刷新 JavaFX 场景?
问题描述
我正在制作一个排序算法可视化工具,我希望 UI 能够实时更新以逐步展示它的工作原理。
但是 UI 仅在 sort() 方法完成时更新,我希望它在 updateHeight() 完成时更新
sort() 方法由 onAction 启动
@FXML
public void sort() throws InterruptedException {
minHeight = RectHeight[0];
counter = 0;
minIndex = 0;
temp = 0;
for(int i=1;i<RectList.size();i++){
System.out.println(RectList.size());
System.out.println(counter);
sort2();
}
}
public void sort2() throws InterruptedException {
System.out.println("start sort");
System.out.println(minHeight);
System.out.println("find min");
for (int i = counter; i < (RectList.size()); i++) {
System.out.println("i= " + i);
if (RectHeight[i] < minHeight) {
minHeight = RectHeight[i];
System.out.println("minHeight= " + minHeight);
System.out.println("minIndex= " + i);
minIndex = i;
}
}
updateHeight();
Thread.sleep(500);
}
public void updateHeight() {
temp = RectHeight[counter];
RectHeight[counter] = RectHeight[minIndex];
RectList.get(counter).setHeight(RectHeight[counter]);
RectHeight[minIndex] = temp;
RectList.get(minIndex).setHeight(temp);
counter++;
minHeight = RectHeight[counter];
minIndex = counter;
}
解决方案
永远不要在 FX 应用程序线程上睡觉。该线程负责渲染 UI,因此Thread.sleep()
正如您所观察到的,通过阻止它来阻止 UI 被渲染。
相反,请使用动画 API。一个简单的Timeline
应该在这里工作:
@FXML
public void sort() {
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(new KeyFrame(Duration.millis(500), e -> sort2()));
timeline.setCycleCount(rectList.size());
minHeight = rectHeight[0];
counter = 0;
minIndex = 0;
temp = 0;
timeline.play();
}
public void sort2() {
System.out.println("start sort");
System.out.println(minHeight);
System.out.println("find min");
for (int i = counter; i < (rectList.size()); i++) {
System.out.println("i= " + i);
if (rectHeight[i] < minHeight) {
minHeight = rectHeight[i];
System.out.println("minHeight= " + minHeight);
System.out.println("minIndex= " + i);
minIndex = i;
}
}
updateHeight();
}
public void updateHeight() {
temp = rectHeight[counter];
rectHeight[counter] = rectHeight[minIndex];
rectList.get(counter).setHeight(rectHeight[counter]);
rectHeight[minIndex] = temp;
rectList.get(minIndex).setHeight(temp);
counter++;
minHeight = rectHeight[counter];
minIndex = counter;
}
推荐阅读
- php - 从具有对象的 PHP 数组中获取 MAX/MIN
- hashicorp-vault - 在 HashiCorp 中创建命名空间时出现不支持的路径错误
- c++ - 当使用 goto 语句时,代码不会在循环内按需要输出
- kubernetes - 永久卷声明未声明该卷
- php - 标记特定的 WooCommerce 产品以添加自定义相关的电子邮件收件人
- python - 从 Python 2.7 更改为 Python 3.7 后,数据又收到了一封信?
- gradle - 是否可以将 apollo-android v2 与 Gradle 5 一起使用?
- cocoa - 10.15 中的 PrefPane 不会重新打开外部窗口
- python-3.x - 使用 python 将 lat 和 long 上传到 umap/osm
- android - 如何从活动中获取 Surface View 属性?(表面视图和活动)