【问题标题】:Bind sum of integer from values of a map to text property将映射值的整数和绑定到文本属性
【发布时间】:2018-02-10 09:53:58
【问题描述】:

我得到了以下数据模型:

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()));

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

例子:

地图:{Water=0, Gold=2, Lumber=5}

标签:7

地图:{Water=0, Gold=0, Lumber=0}

标签:0

如何使用 JavaFX 绑定或/和 EasyBind 实现此目的?

【问题讨论】:

    标签: java javafx easybind


    【解决方案1】:

    MapProperty&lt;S, T&gt; 可以用作ObservableMap&lt;S, T&gt; 并收到包装地图更改的通知。这意味着您可以在地图上使用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")));
    

    注意:返回属性对象本身的方法的方法名约定使用&lt;propertyName&gt;Property。对于您的GamecurrentPlayer 属性,这将是currentPlayerProperty() 而不是getCurrentPlayer()resourceCardsProperty() 而不是getResourceCards()。我在上面的代码中使用了包括get在内的方法名。

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

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多