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

时间:2017-08-11 17:39:57

标签: java multithreading javafx properties javafx-8

我想更新管理多个建筑物的应用程序。这些中的每一个都包含它所包含的人数。每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的绑定功能来构建一个新的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可以适应期刊的内容,但经过一些阅读后,我对更新将被绑定到活动场景图的属性的(线程)安全性产生怀疑来自后台任务...

除非绑定带有一些魔法使我想做的事情成为可能,否则最佳做法是什么。

0 个答案:

没有答案