33

JavaFX ListViewコントロールを使用して、人物のリスト(POJOSでコーディングされ、名前と名前のプロパティを含む)を表示したいと思います。ListViewを作成し、人物のリストをObservableListとして追加しました。ObservableListに新しい人を削除または追加すると、すべて正常に機能しますが、POJOを変更しても、ListViewの更新はトリガーされません。ListViewの更新をトリガーするには、変更されたPOJOをObservableListから削除して追加する必要があります。上記の回避策なしでPOJOSの変更を表示する可能性はありますか?

4

7 に答える 7

7

から継承されたメソッドを呼び出すことにより、 を手動でトリガーすることができます。ListView.EditEventこれにより、ListViewが更新されます。例えば、ListView::fireEventjavafx.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 に答える