[英]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.