ListView未使用JavaFXML正确更新

ListView未使用JavaFXML正确更新,java,listview,javafx,Java,Listview,Javafx,在JavaFX中,我使用ListView显示添加到集合或从集合中移除的项目。我已经创建了一个ObserviceSet,与ListView一起使用以显示更新,但是当集合更改时,ListView没有正确更新。这是我的代码和解决方法。但是为什么它没有像预期的那样工作呢 public class FXMLDocumentController implements Initializable { @FXML private ListView listView; Observable

在JavaFX中,我使用ListView显示添加到集合或从集合中移除的项目。我已经创建了一个ObserviceSet,与ListView一起使用以显示更新,但是当集合更改时,ListView没有正确更新。这是我的代码和解决方法。但是为什么它没有像预期的那样工作呢

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

这是预期的行为。您调用的方法“创建一个新的可观察列表,并将[集合]的内容添加到其中”。因此,对集合的后续更改不会更改列表

另一个选项是只向可观察集注册侦听器,并通过适当地添加或删除元素来更新列表视图的项:

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());
    }
}
公共类FXMLDocumentController实现可初始化{
@FXML
私有列表视图列表视图;
私有observeSet observeSet;//用于防止重复的observeSet
私人int i=3;
@凌驾
公共void初始化(URL、ResourceBundle rb){
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
ObservateSet=FXCollections.ObservateSet();
observableSet.addListener((SetChangeListener.Change尝试调用

listview.refresh();
从列表中添加和删除项目后

或者,您可以在列表中添加一个更改侦听器,并从中调用refresh方法。
但我更喜欢第一种方法,因为添加侦听器有时不会更新列表视图。

有没有其他方法可以用来反映我对列表视图中的集合所做的更改?您好,我也有同样的问题,并且我的列表视图不会更新。下面的答案对我不起作用。您找到解决方案了吗?
listview.refresh();