1

我得到以下数据模型:

public class Player {
  // enum to integer (count)
  @Getter
  private MapProperty<ResourceType, Integer> resourceCards = new SimpleMapProperty<>();

  public void addResource(final ResourceType resourceType, final int amount) {
    this.resourceCards.get().put(resourceType, this.resourceCards.get().get(resourceType) + amount);
  }
}


public class Game {

  @Getter
  @Setter
  private ObjectProperty<Player> currentPlayer = new SimpleObjectProperty<>();

 }

将地图绑定到文本属性非常简单:

final Label label = new Label();
label.textProperty().bind(EasyBind.select(game.getCurrentPlayer()).selectObject(player -> player.getResourceCards().asString()));

我想在标签中显示资源卡的总量。

例子:

地图:{水=0,金=2,木材=5}

标签: 7

地图:{水=0,金=0,木材=0}

标签: 0

如何使用 JavaFX Bindings 或/和EasyBind实现这一目标?

4

1 回答 1

1

AMapProperty<S, T>可以用作ObservableMap<S, T>并获得包装地图更改的通知。这意味着您可以Bindings.createStringBinding在地图上使用:

label.textProperty().bind(EasyBind.select(game.getCurrentPlayer())
                                  .selectObject(player -> Bindings.createStringBinding(() -> Integer.toString(player.getResourceCards().values().stream().mapToInt(Integer::intValue).sum()),
                                                                                       player.getResourceCards())
                                  .orElse("0")));

注意:返回属性对象本身的方法的方法名称约定使用<propertyName>Property. 如果是您GamecurrentPlayer财产,这将是currentPlayerProperty()代替getCurrentPlayer()resourceCardsProperty()代替getResourceCards(). 我使用了get上述代码中的方法名称。

此外,MapProperty除非您打算替换整个地图而不是简单地修改Map的内容,否则使用 a 是不必要的。ObservableMap在这种情况下,您可以简单地使用类型的只读属性。

于 2018-02-10T13:00:14.657 回答