Scala 通知javafx内容已更改

Scala 通知javafx内容已更改,scala,javafx,Scala,Javafx,这里有一个简单的类,我将它保存在javafxListView class MyItem { var active: Boolean = true def toString = "Test" } 我为MyItem class MyCell extends ListCell[MyItem] { override def updateItem(item: MyItem, empty: Boolean): Unit = { super.updateItem(item, empt

这里有一个简单的类,我将它保存在javafx
ListView

class MyItem {
   var active: Boolean = true
   def toString = "Test"
}
我为
MyItem

class MyCell extends ListCell[MyItem] {
  override def updateItem(item: MyItem, empty: Boolean): Unit = {
    super.updateItem(item, empty)
    if(item != null) {
      setText(item.toString)
      if(item.active) setGraphic(g1) else setGraphic(g2)
    }
  }
}
我已经在listview上设置了这个选项,但是我希望图形随着
活动的
变量一起更改。如果这是swing,我会在更改它时调用
重新绘制
,但这不是一个选项


有没有办法通知javafx变更?我是否应该采用不同的结构?

尝试将
var激活
设置为
BooleanProperty
,并在
激活
上添加一个
ChangeListener
。如果这是在Java上

修改模型

class MyItem {
   private BooleanProperty active;

   public MyItem() {
        active = new SimpleBooleanProperty();
   }

   public BooleanProperty activeProperty() {
      return active;
   }

   public void setActive(boolean active) {
       this.active.set(active);
   }

   public boolean isActive() {
       return active.get();
   }

}
修改更新方法:

super.updateItem(item, empty);
if (item != null) {
    setText(item.toString());
    item.activeProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) setGraphic(g1);
        else setGraphic(g2); 
    });
}

你需要做的不止这些。如果在先前表示不同的项之后重新使用单元格来表示项,则它仍将侦听旧项(以及新项)。所以你也需要安排删除听众。@Lucas:不客气。但正如@James_D所评论的,您需要确保在向视图显示模型后,必须删除与
BooleanProperty
关联的
changelister