2013-08-06 3 views
8

Я использую ObjectProperty JavaFx в одном из моих классов. Я использую его для функций привязки. Проблемы состоят в том, что я хочу, чтобы люди могли привязываться к нему, но не изменять значение. Я не могу думать о кастовом доказательстве этого способа (где у людей не будет ЛЮБОГО способа изменить его извне), но должен быть какой-то способ сделать это.Настройка только для чтения с использованием свойства JavaFx

ответ

8

Решение

Вы ищете ReadOnlyObjectWrapper.

Образец

Вот пример использования берется из sample tic tac toe game, который я написал:

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

Объяснение

Это позволяет состояние площади быть представлена свойство, чтобы внешние пользователи Квадрата могли привязываться к состоянию Квадрата, но само государство инкапсулировано на Квадрат, так что только Квадрат может изменить свое состояние.

Примером использования этого шаблона является объект SquareSkin, который содержит видимые узлы для представления Квадрата. Кожа может прослушивать изменения свойства состояния связанного квадрата и обновлять изображение, которое оно использует, для отображения квадрата соответствующим образом.

Чтобы убедиться, что значения объекта, заключенные в ReadOnlyWrapper, не могут быть изменены извне, лучше всего сделать эти значения объектов immutable (например, объекты не имеют функций сеттера, а только функции getter).

Дальнейшие примеры

В игре код, который я связан содержит много других примеров различных обязательных моделей и обычаев (я написал его частично в качестве обязательного упражнения, чтобы увидеть, что произойдет, если вы используете много привязок в приложение).

+0

Ahhh ... Это имеет смысл. Казалось, должен быть способ сделать это. Спасибо. –

Смежные вопросы