2017-10-02 1 views
0

Dans JavaFX, j'utilise ListView pour afficher les éléments ajoutés ou supprimés d'un ensemble. J'ai fait un observableSet à utiliser avec ListView pour afficher les mises à jour mais le ListView ne se met pas à jour correctement lorsque le Set change. Voici mon code avec un travail autour. Mais pourquoi ça ne marche pas comme prévu?ListView ne se met pas correctement à jour avec JavaFX FXML

public class FXMLDocumentController implements Initializable { 
    @FXML 
    private ListView listView; 
    ObservableSet<String> observableSet; //ObservableSet to prevent dublicates 
    Integer i = 3; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
     observableSet = FXCollections.observableSet(); 
     observableSet.addAll(Arrays.asList("Item1", "Item2", "Item3")); 
     //Setting up ListView to the ObservableSet 
     listView.setItems(FXCollections.observableArrayList(observableSet)); 

    } 
    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     observableSet.add("Item" + i++); 
     //Setting up ListView to the ObservableSet otherwise it won't update 
     //My understanding that I don't have to do this with an observableSet 
     listView.setItems(FXCollections.observableArrayList(observableSet)); 
    } 
    @FXML 
    private void handleRemoveAction(ActionEvent event) { 
     observableSet.removeAll(listView.getSelectionModel().getSelectedItems()); 
     //Setting up ListView to the ObservableSet otherwise it won't update 
     listView.setItems(FXCollections.observableArrayList(observableSet)); 
    } 
} 

La question: Je dois garder la mise en place du ListView comme démontré ci-dessus et au-dessous chaque fois que le observableSet est mis à jour. Sinon, la modification n'apparaîtra pas dans ListView.

listView.setItems(FXCollections.observableArrayList(observableSet)); 
+0

Existe-t-il un autre moyen de répercuter les modifications apportées à l'ensemble dans ListView? – Moe

Répondre

1

Ceci est le comportement attendu. La méthode que vous appelez create the observable list "Crée une nouvelle liste observable et ajoute le contenu de [l'ensemble]". Donc, les changements ultérieurs à l'ensemble ne changeront pas la liste.

Une autre option est juste pour enregistrer un écouteur avec l'ensemble observable, et mettre à jour les éléments de la liste, en ajoutant ou en supprimant un élément approprié:

public class FXMLDocumentController implements Initializable { 
    @FXML 
    private ListView listView; 
    private ObservableSet<String> observableSet; //ObservableSet to prevent dublicates 
    private int i = 3; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
     observableSet = FXCollections.observableSet(); 

     observableSet.addListener((SetChangeListener.Change<? extends String> c) -> { 
      if (c.wasAdded()) { 
       listView.getItems().add(c.getElementAdded()); 
      } 
      if (c.wasRemoved()) { 
       listView.getItems().remove(c.getElementRemoved()); 
      } 
     }); 

     observableSet.addAll(Arrays.asList("Item1", "Item2", "Item3")); 

    } 
    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     observableSet.add("Item" + i++); 
    } 
    @FXML 
    private void handleRemoveAction(ActionEvent event) { 
     observableSet.removeAll(listView.getSelectionModel().getSelectedItems()); 
    } 
} 
0

Essayez d'appeler

listview.refresh(); 

après avoir ajouté et supprimer des éléments de la liste.

ou vous pouvez ajouter un écouteur de modification dans la liste et y appeler la méthode d'actualisation. mais je préfère la première méthode, car l'ajout d'un écouteur ne mettra parfois pas à jour l'affichage de la liste.