我想批处理一堆任务(更新GUI)并每秒运行一次。 (我每秒钟有数百次更新,导致Java FX 2冻结)
public void update(String price){
Platform.runLater(new Runnable(){
@Override
public void run() {
priceLabel.setText(price);
}});
}
在Java中最简单的方法是什么?
答案 0 :(得分:2)
通常,对GUI的所有更新都会一起批处理并在GUI线程中处理。我认为你的架构是你真正的问题。每10毫秒更换一次标签是不明智的。即使Java FX支持这一点,用户唯一会看到的是闪烁。因此,我建议您更新内部数据模型,并以特定时间速率对用户显示数据模型的更改。您的数据模型将独立于您的用户界面,后台线程可以每2秒左右向您的用户界面提交一次单更新。
答案 1 :(得分:0)
是什么触发了变化?如果文本链接到某个对象的值you could use binding,则在对象的值发生变化时自动更新GUI。
或者,您可以尝试手动执行此操作。例如,请参阅下面的代码(这是简单的 - 您可能需要在运行runnables时清除列表以避免运行它们两次 - 在这种情况下,您需要处理并发问题等):
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final List<Runnable> list = new CopyOnWriteArrayList<Runnable>(); //your updates
Runnable updateGui = new Runnable() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
for (Runnable r : list) {
r.run();
}
}
});
}
};
scheduler.scheduleAtFixedRate(updateGui, 0, 1, TimeUnit.SECONDS);
list.add(new Runnable() {
@Override
public void run() {
priceLabel.setText(price);
}
});