将地图值的整数总和绑定到文本 属性
Bind sum of integer from values of a map to text property
我得到了以下数据模型:
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 绑定实现此目的 or/and EasyBind?
A MapProperty<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
。如果你的 Game
的 currentPlayer
属性 这将是 currentPlayerProperty()
而不是 getCurrentPlayer()
和 resourceCardsProperty()
而不是 getResourceCards()
。我在上面的代码中使用了包括 get
在内的方法名称。
此外,使用 MapProperty
是不必要的,除非您打算替换整个地图而不是简单地修改 Map
的内容。在这种情况下,您可以简单地使用 ObservableMap
类型的只读 属性。
我得到了以下数据模型:
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 绑定实现此目的 or/and EasyBind?
A MapProperty<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
。如果你的 Game
的 currentPlayer
属性 这将是 currentPlayerProperty()
而不是 getCurrentPlayer()
和 resourceCardsProperty()
而不是 getResourceCards()
。我在上面的代码中使用了包括 get
在内的方法名称。
此外,使用 MapProperty
是不必要的,除非您打算替换整个地图而不是简单地修改 Map
的内容。在这种情况下,您可以简单地使用 ObservableMap
类型的只读 属性。