JavaFX ListViewコントロールを使用して、人物のリスト(POJOSでコーディングされ、名前と名前のプロパティを含む)を表示したいと思います。ListViewを作成し、人物のリストをObservableListとして追加しました。ObservableListに新しい人を削除または追加すると、すべて正常に機能しますが、POJOを変更しても、ListViewの更新はトリガーされません。ListViewの更新をトリガーするには、変更されたPOJOをObservableListから削除して追加する必要があります。上記の回避策なしでPOJOSの変更を表示する可能性はありますか?
質問する
38012 次
7 に答える
7
から継承されたメソッドを呼び出すことにより、 を手動でトリガーすることができます。ListView.EditEvent
これにより、ListView
が更新されます。例えば、ListView::fireEvent
javafx.scene.Node
/**
* Informs the ListView that one of its items has been modified.
*
* @param listView The ListView to trigger.
* @param newValue The new value of the list item that changed.
* @param i The index of the list item that changed.
*/
public static <T> void triggerUpdate(ListView<T> listView, T newValue, int i) {
EventType<? extends ListView.EditEvent<T>> type = ListView.editCommitEvent();
Event event = new ListView.EditEvent<>(listView, type, newValue, i);
listView.fireEvent(event);
}
またはワンライナーとして、
listView.fireEvent(new ListView.EditEvent<>(listView, ListView.editCommitEvent(), newValue, i));
以下は、その使用方法を示すサンプル アプリケーションです。
/**
* An example of triggering a JavaFX ListView when an item is modified.
*
* Displays a list of strings. It iterates through the strings adding
* exclamation marks with 2 second pauses in between. Each modification is
* accompanied by firing an event to indicate to the ListView that the value
* has been modified.
*
* @author Mark Fashing
*/
public class ListViewTest extends Application {
/**
* Informs the ListView that one of its items has been modified.
*
* @param listView The ListView to trigger.
* @param newValue The new value of the list item that changed.
* @param i The index of the list item that changed.
*/
public static <T> void triggerUpdate(ListView<T> listView, T newValue, int i) {
EventType<? extends ListView.EditEvent<T>> type = ListView.editCommitEvent();
Event event = new ListView.EditEvent<>(listView, type, newValue, i);
listView.fireEvent(event);
}
@Override
public void start(Stage primaryStage) {
// Create a list of mutable data. StringBuffer works nicely.
final List<StringBuffer> listData = Stream.of("Fee", "Fi", "Fo", "Fum")
.map(StringBuffer::new)
.collect(Collectors.toList());
final ListView<StringBuffer> listView = new ListView<>();
listView.getItems().addAll(listData);
final StackPane root = new StackPane();
root.getChildren().add(listView);
primaryStage.setScene(new Scene(root));
primaryStage.show();
// Modify an item in the list every 2 seconds.
new Thread(() -> {
IntStream.range(0, listData.size()).forEach(i -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(listData.get(i));
Platform.runLater(() -> {
// Where the magic happens.
listData.get(i).append("!");
triggerUpdate(listView, listData.get(i), i);
});
});
}).start();
}
public static void main(String[] args) {
launch(args);
}
}
于 2014-04-17T18:51:11.077 に答える
3
Java 8u60 ListView ではrefresh()
、ビューを手動で更新する方法が公式にサポートされています。JavaDoc:
これは、基になるデータ ソースが変更され、ListView 自体では監視されない場合に役立ちます。
ここでこの問題にこのメソッドを使用して、ListView 内のアイテムのコンテンツを更新することに成功しました。
于 2016-11-10T17:59:21.397 に答える
-1
ObservableList<String> items = FXCollections.observableArrayList();
ListView lv;
lv.setItems(items);
items.add();
items.remove;
于 2012-12-23T04:35:26.907 に答える