2016-01-12 2 views
1

J'ai une liste privée et je ne veux pas qu'elle puisse être modifiée de l'extérieur en général. Juste ajouter de l'extérieur est autorisé et seulement si l'objet est valide. Par conséquent, je l'habitude d'écrire comme ceci:Comment rendre JavaFX ListProperty modifiable uniquement par des méthodes personnalisées

private List<Object> list = new ArrayList<>(); 

public List<Object> getList() 
{ 
    return Collections.unmodifiableList(list); 
} 

public void addObject(Object object) 
{ 
    if (isObjectValid(object)) //any validation 
     list.add(object); 
} 

maintenant à des fins JavaFX je tourne la liste à une propriété:

private ListProperty<Object> list = 
       new SimpleListProperty<>(FXCollections.observableArrayList()); 

à tirer profit des avantages d'une propriété comme liaison de données et la ListChangeListener I avoir à fournir la propriété au monde extérieur. Mais l'accès à toutes les méthodes d'une liste est également fourni. (Pour utiliser un ReadOnlyListProperty n'a pas d'effet puisque l'instance de liste elle-même ne changera jamais.) Que puis-je faire pour atteindre tous les objectifs:

  • ListProperty privé
  • ListChangeListener peuvent être ajoutés à l'extérieur
  • utilisable pour la liaison les dépendances de l'extérieur (les créer méthodes forment la classe Manchettes)
  • Aucune modification de l'instance de propriété ou une liste
  • modification du contenu de la liste à l'extérieur que par mes propres méthodes

Répondre

1

Non testé, mais essayer:

private ListProperty<Object> list = new SimpleListProperty<>(FXCollections.observableArrayList()); 

private ReadOnlyListWrapper<Object> publicList = new ReadOnlyListWrapper<>(); 

et dans le constructeur:

publicList.bind(Bindings.createObjectBinding(
    () -> FXCollections.unmodifiableObservableList(list.getValue()), 
    list)); 

alors votre méthode accesseur est

public ReadOnlyListProperty<Object> getList() { 
    return publicList.getReadOnlyProperty(); 
} 
+0

Grand, je l'ai testé et il semble remplir tous les objectifs! Cependant, votre méthode de liaison manque un crochet et la méthode de FXCollections s'appelle unmodifiableObservableList(). – Arceus

+0

Si cela répond à vos besoins, n'oubliez pas de le marquer comme une solution. – hotzst

+0

@Arceus Merci d'avoir souligné les fautes de frappe (comme vous pouvez le deviner, je l'ai juste saisi directement): maintenant corrigé. –