2013-08-06 18 views
8

私は自分のクラスでJavaFx ObjectPropertyを使用しています。私はバインド機能のためにそれを使用しています。問題は、人々がそれに縛られることができるようにしたいが、価値を変えることではないということです。私は、これを行うための賢明な証明方法(人々が外部からそれを変更する方法を持っていない)を考えることはできませんが、それを行うには何らかの方法が必要です。JavaFxプロパティで読み取り専用を設定する

答えて

8

ソリューション

あなたは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()); 
     ... 
    } 
    } 
} 

説明

このスクエアの状態によって表現できる:ここ

サンプル

は、私が書いたsample tic tac toe gameから採取した使用例でありますSquareの外部ユーザーがSquareの状態にバインドできるようにするプロパティですが、状態自体はSquareにカプセル化されているため、正方形は自分の状態を変えることができます。

このパターンの使用例はSquareを表す可視ノードを含むSquareSkinオブジェクトです。スキンは、関連する四角の状態プロパティの変更をリッスンし、四角形を適切に表示するために使用するイメージを更新できます。

ReadOnlyWrapperで囲まれたObject値を外部的に変更できないようにするには、オブジェクト値immutableを作成することをお勧めします(たとえば、オブジェクトにはセッター関数がなく、ゲッター関数のみがあります)。

さらに例

私はリンクされたゲームのコードは、異なる結合パターンと使用の他の多くの例が含まれていますが(私はあなたにバインディングの多くを使用する場合に何が起こるか見に結合練習として、部分的にそれを書きましたアプリ)。

+0

ああ...それは完全に意味があります。これを行う方法がなければならないようだった。ありがとうございました。 –

関連する問題