gpt4 book ai didi

java - 如何从后台定期任务修改模型属性?

转载 作者:行者123 更新时间:2023-12-02 12:22:55 25 4
gpt4 key购买 nike

我想更新一个管理多个建筑物的应用程序。每一件都佩戴着它所容纳的人数。每10秒,每栋建筑的人口就会增加1。

我所说的“更新”是指“从 Swing 移植到 JavaFX”。

当前的 Swing 应用程序通过后台 javax.swing.Timer 线程实现周期性操作:

new Timer(10000, (e) -> {
for (Building building : theSuperKawaiBuildingList) {
building.setPopulation(building.getPopulation() + 1);
}
});

...并且model.Buildingjava.util.Observable的子类:

public class Building extends Observable {
private int population;

public synchronized int getPoulation() {
return population;
}

public synchronized void setPoulation(int value) {
population = value;

setChanged();
notifyObservers();
}

public Building(int initPopulation) {
population = initPopulation;
}
}

现在,我想使用 JavaFX 而不是 Swing 以及 API 的绑定(bind)功能来构建新的 GUI,可能会实现 model.Building 类,如下所示:

public class Building {
// <editor-fold desc="FX Property - Population">
private final IntegerProperty population;
public IntegerProperty populationProperty() { return population; }
public int getPopulation() { return population.get(); }
public void setPopulation(int value) { population.set(value); }
// </editor-fold>

public Building(int initPopulation) {
population = new SimpleIntegerProperty(initPopulation);
}
}

我猜 java.util.Timer 可以满足周期性的要求,但是在阅读了一些内容之后,我对更新属性的(线程)安全性表示怀疑从后台任务绑定(bind)到 Activity 场景图...

除非绑定(bind)具有某种魔力使我想做的事成为可能,否则最好的做法是什么。

最佳答案

如果模型中的属性受场景图中 UI 组件的属性绑定(bind),则无法从后台线程更新模型中的属性。

您可以将更新模型的调用包装在 Platform.runLater(...) 中,以便它在 FX 应用程序线程上执行:

new Timer(10000, (e) -> {
Platform.runLater(() -> {
for (Building building : theSuperKawaiBuildingList) {
building.setPopulation(building.getPopulation() + 1);
}
});
});

(或使用 java.util.Timer 执行等效操作)。

另一种方法(可能更好)是使用 JavaFX 动画 API:

Timeline timeline = new Timeline();
KeyFrame keyFrame = new KeyFrame(Duration.seconds(10), e -> {
for (Building building : theSuperKawaiBuildingList) {
building.setPopulation(building.getPopulation() + 1);
}
});
timeline.getKeyFrames().add(keyFrame);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

作为时间线一部分的关键帧上的任何处理程序都在 FX 应用程序线程上执行。

关于java - 如何从后台定期任务修改模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45640928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com