2015-07-23 1 views
0

je besoin d'un JavaFX Property pour un BitSet afin de créer un TableColumn avec un bouton à bascule pour chaque bit dans le BitSet. J'ai implémenté Property<BitSet> mais même avec la documentation d'Oracle, la signification et l'utilisation de certaines méthodes d'interface me échappent encore, car pour moi tout cela ressemble à un passe-partout superflue. S'il vous plaît dites-moi si je suis sur la bonne voie avec la mise en œuvre et ce que je peux améliorer. Je n'ai pas encore implémenté de liaisons car je ne m'attends pas à en avoir besoin pour mon cas d'utilisation.JavaFX Propriété pour un BitSet

import java.util.*; 
import javafx.beans.InvalidationListener; 
import javafx.beans.property.Property; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 

public class BitSetProperty implements Property<BitSet> 
{ 
    private BitSet value; 
    private final Set<ChangeListener<? super BitSet>> changeListeners = new HashSet<>(); 
    private final Set<InvalidationListener> invalidationListeners = new HashSet<>(); 

    @Override public Object getBean() {return value;} 

    @Override public String getName() {return "what shall I return here?";} 

    @Override public void addListener(ChangeListener<? super BitSet> listener) {changeListeners.add(listener);} 

    @Override public void removeListener(ChangeListener<? super BitSet> listener) {changeListeners.remove(listener);} 

    @Override public BitSet getValue() 
    { 
     return (BitSet)value.clone(); 
    } 

    @Override public void addListener(InvalidationListener listener) {invalidationListeners.add(listener);} 
    @Override public void removeListener(InvalidationListener listener) {invalidationListeners.remove(listener);} 

    @Override public void setValue(BitSet value) 
    { 
     if(!value.equals(this.value)) 
     { 
      changeListeners.stream().forEach(cl->cl.changed(this, this.value, (BitSet)value.clone())); 
      invalidationListeners.stream().forEach(il->il.invalidated(this)); 
     } 
     this.value=value; 
    } 

    @Override public void bind(ObservableValue<? extends BitSet> observable) 
    { 
     throw new UnsupportedOperationException(); 
    } 

    @Override public void unbind() 
    { 
     throw new UnsupportedOperationException(); 
    } 

    @Override public boolean isBound() 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override public void bindBidirectional(Property<BitSet> other) 
    { 
     throw new UnsupportedOperationException(); 
    } 

    @Override public void unbindBidirectional(Property<BitSet> other) 
    { 
     throw new UnsupportedOperationException(); 
    } 
} 

Répondre

0

En réponse à ma propre question, il s'avère que j'ai mal compris comment les propriétés fonctionnent. Je pensais qu'ils déclenchent des changements quand l'état interne change mais je sais maintenant qu'ils traitent le contenu comme une boîte noire (je suppose que le contenu est immuable) et se déclenchent juste quand le contenu est remplacé, ce qui est un problème beaucoup plus facile. Ma question peut alors être résolue en utilisant:

ObjectProperty<BitSet> property = new SimpleObjectProperty<>();