【问题标题】:ListView is not updating properly with JavaFX FXMLListView 未使用 JavaFX FXML 正确更新
【发布时间】:2017-10-02 03:31:08
【问题描述】:

在 JavaFX 中,我使用 ListView 来显示添加到集合或从集合中移除的项目。我已经制作了一个 observableSet 与 ListView 一起使用来显示更新,但是当 Set 更改时 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));
    }
}

问题: 每次更新 observableSet 时,我都必须按照上面和下面的说明继续设置 ListView。否则更改不会显示在 ListView 中。

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

【问题讨论】:

  • 还有其他方法可以用来反映我对 ListView 中的 Set 所做的更改吗?
  • 嗨,我有同样的问题,我的列表视图没有更新。下面的2个答案对我不起作用。你找到解决办法了吗?

标签: java listview javafx


【解决方案1】:

尝试调用

listview.refresh();

在列表中添加和删除项目之后。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 2013-11-04
      • 2016-10-17
      • 1970-01-01
      • 2018-09-15
      • 2023-03-27
      • 2018-07-26
      • 2017-07-30
      相关资源
      最近更新 更多