Извините, что беспокоился об этой широко обсуждаемой теме. Я создаю диалог для выбора строковых значений из одного списка в другой. В начале есть список опций. получить/setSourceItems и получить/setTargetItems являются методы получения и установки для ObservableListsКак обновить ListView в JavaFX
private ListView<String> sourceListView;
private ObservableList<String> sourceItems;
private ListView<String> targetListView;
private ObservableList<String> targetItems;
List<String> options = getSelectedMetaDataList();
setSourceItems(FXCollections.observableArrayList(options));
sourceListView = new ListView(getSourceItems());
setTargetItems(FXCollections.observableArrayList(new ArrayList()));
targetListView = new ListView(getTargetItems());
Диалог показывает ListViews хорошо в начале. Источник заполняется опциями, а цель пуста. Но когда я использую кнопку, в пользовательском интерфейсе ничего не происходит. Например, когда я перемещаю все элементы из источника в цель, я вижу элементы в targetItems observableList, но ничего в targetListView в пользовательском интерфейсе.
Button selectAllBtn = new Button(">>");
selectAllBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (getSourceItems().size() > 0) {
setTargetItems(getSourceItems());
targetListView.refresh();
setSourceItems(null);
sourceListView.refresh();
System.out.println("selectAllBtn target: " + getTargetItems().toString());
}
}
});
Что-то не так с моделью выбора тоже. Потому что, когда я пытаюсь переместить выбранные элементы sourceListView.getSelectionModel(), getSelectedItems() пуст, даже когда я выделил элемент. Я пытался перемещать объекты не только с помощью наблюдаемого списка, но и с помощью targetListView.getItems(). AddAll (movingItems); По-прежнему никаких изменений в пользовательском интерфейсе.
Button selectOneBtn = new Button(">");
selectOneBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
ObservableList<String> movingItems = sourceListView.getSelectionModel().getSelectedItems();
System.out.println("selectOneBtn: " + sourceListView.getSelectionModel().getSelectedItems().size());
System.out.println("selectOneBtn: " + targetListView.getSelectionModel().getSelectedItems().size());
if (movingItems.size() > 0) {
System.out.println("selectOneBtn: " + movingItems.toString());
sourceListView.getSelectionModel().clearSelection();
sourceListView.getItems().removeAll(movingItems);
sourceListView.refresh();
targetListView.getItems().addAll(movingItems);
targetListView.refresh();
System.out.println("selectOneBtn source: " + getSourceItems().toString());
System.out.println("selectOneBtn target: " + getTargetItems().toString());
}
}
});
Заранее спасибо.
Вы, мой друг, усложнили простую задачу. – Sedrick
Я предлагаю вам избавиться от ваших сеттеров и геттеров и использовать ListView и ObservableList, как они были предназначены. – Sedrick
Или, по крайней мере, избавиться от сеттеров. 'ObservableList' обычно лучше всего работают, если они являются окончательными. Поскольку они изменяемы, редко приходится менять ссылки, чтобы указать на новый список. –