簡體   English   中英

ListView無法使用JavaFX FXML正確更新

[英]ListView is not updating properly with JavaFX FXML

在JavaFX中,我使用ListView來顯示添加到Set或從Set中刪除的項目。 我已經制作了一個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));

這是預期的行為。 創建可觀察列表的調用方法“創建一個新的可觀察列表,並將[集合]的內容添加到其中”。 因此,對集合的后續更改不會更改列表。

另一個選擇是向可觀察的集合注冊一個偵聽器,並通過適當地添加或刪除元素來更新列表視圖的項目:

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

嘗試致電

listview.refresh();

從列表中添加和刪除項目后。

或者,您可以在列表上添加一個更改偵聽器,然后從中調用刷新方法。 但我更喜歡第一種方法,因為添加偵聽器有時不會更新列表視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM