2013-08-06 1 views
8

Sto utilizzando una ObjectProperty JavaFx in una delle mie classi. Lo sto usando per le funzionalità di bind. Il problema è che voglio che le persone siano in grado di legarsi ad esso, ma non di cambiare il valore. Non riesco a pensare a un modo di fare una casta per fare questo (dove le persone non avranno QUALSIASI modo di cambiarlo dall'esterno), ma ci deve essere un modo per farlo.Impostazione di sola lettura con una proprietà JavaFx

risposta

8

Soluzione

Stai cercando il ReadOnlyObjectWrapper.

Esempio

Ecco un esempio di utilizzo tratto da un sample tic tac toe game cui ho scritto:

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

Spiegazione

Questo permette lo stato della Piazza ad essere un rappresentata da una proprietà in modo che gli utenti esterni del quadrato possano legarsi allo stato di Square, tuttavia lo stato stesso è incapsulato nel quadrato, quindi solo il Square può cambiare il suo stato.

Un esempio di utilizzo per questo modello è un oggetto SquareSkin che contiene i nodi visibili per rappresentare il quadrato. La pelle può ascoltare le modifiche alla proprietà di stato del quadrato associato e aggiornare l'immagine che utilizza per visualizzare il quadrato in modo appropriato.

Per garantire davvero che i valori oggetto racchiusi nella ReadOnlyWrapper non possono essere modificati esternamente, è meglio rendere tali valori oggetto immutable (ad esempio gli oggetti non hanno funzioni setter, solo getter funzioni).

Ulteriori esempi

Il codice del gioco ho linkato contiene molti altri esempi di diversi modelli di legame e gli usi (ho scritto in parte come un esercizio di legame per vedere cosa sarebbe successo se si utilizza un sacco di attacchi in un app).

+0

Ahhh ... Questo ha perfettamente senso. Sembrava che ci dovesse essere un modo per farlo. Grazie. –