8

我在我的一个类中使用 JavaFx ObjectProperty。我将它用于绑定功能。问题是我希望人们能够绑定它,而不是改变它的价值。我想不出一种种姓证明的方法来做到这一点(人们无法从外部改变它),但必须有某种方法来做到这一点。

4

1 回答 1

9

解决方案

您正在寻找ReadOnlyObjectWrapper

样本

以下是我编写的井字游戏示例中的示例用法:

class Square {

  enum State { EMPTY, NOUGHT, CROSS }

  private ReadOnlyObjectWrapper<State> state = 
    new ReadOnlyObjectWrapper<>(State.EMPTY);

  public ReadOnlyObjectProperty<State> stateProperty() {
    return state.getReadOnlyProperty();
  }

  public State getState() {
    return state.get();
  }

  public void pressed() {
    if (!game.isGameOver() && state.get() == State.EMPTY) {
      state.set(game.getCurrentPlayer());
      ...
    }
  }
}

解释

这允许 Square 的状态由属性表示,以便 Square 的外部用户可以绑定到 Square 的状态,但状态本身被封装在 Square 中,因此只有 Square 可以更改它自己的状态。

此模式的一个使用示例是 SquareSkin 对象,其中包含表示 Square 的可见节点。皮肤可以监听相关方块的状态属性的变化,并更新它用来适当显示方块的图像。

要真正确保 ReadOnlyWrapper 中包含的 Object 值不能在外部更改,最好使这些 Object 值不可变(例如,Object 没有 setter 函数,只有 getter 函数)。

进一步的例子

我链接的游戏代码包含许多其他不同绑定模式和用法的示例(我将其部分编写为绑定练习,以了解如果您在应用程序中使用大量绑定会发生什么)。

于 2013-08-06T01:58:15.290 回答