このような幅広いトピックで迷惑をおかけして申し訳ありません。 私は1つのリストから別のリストに文字列値を選択するダイアログを作成しています。最初にオプションのリストがあります。 GET/setSourceItemsおよび/ setTargetItemsダイアログが起動時にもリストビューを示しObservableListsJavaFXでListViewをリフレッシュする方法
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());
ためのゲッターとセッターあります。ソースはオプションで埋められ、ターゲットは空です。 しかし、私はボタンを使用すると、UI上で何も起こりません。 たとえば、すべてのアイテムをソースからターゲットに移動すると、targetItems observableListの項目は表示されますが、UIの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()は空です。私はobservableListだけでなく、targetListView.getItems()を使って項目を移動しようとしました。addAll(movingItems); まだUIは変更されていません。
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'は一般的に最終的な場合に最も効果的です。それらは変更可能なので、新しいリストを指すように参照を変更する必要はほとんどありません。 –