18

問題

からアイテムが削除されると、削除の場所と削除されたアイテムのリストをObservableList示すchange イベントが発生します。ドキュメントには次のように記載されています。getFrom()getRemoved()

このgetRemoved()メソッドは、リストから置換または削除された要素のリストを返します。

そのように述べられていませんが、アイテムのリストが元のリストからの連続したサブリストであることを暗示していると思いました。私はその前提で多くのコードを書いてきましたが、現在、そのように動作しないTreeTableViewの選択モデルで問題が発生しています。

たとえば、3 つの「ノード」行を持つ単純なツリー テーブルを考えてみましょう。その3行を選択すると...

3 つの行が選択されました

...次に、中央の行だけをクリックして選択します...

ここに画像の説明を入力

...発生する変更イベントはtreeTableView.getSelectionModel().getSelectedItems()次のようになります。

{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0,  }

単一の変更イベントで、「ノード 1」と「ノード 3」がselectedItemsリストのインデックス 0 から削除されたことを報告します。

オブジェクトには、呼び出しでChange区切られた 2 つの個別の削除イベントがあると予想していました。next()への最初の呼び出しnext()は、「ノード 1」がインデックス 0 で削除されたnext()ことを通知し、2 回目の呼び出しは、「ノード 3」がインデックス 1 で削除されたことを通知します。一度。

質問

getRemoved()連続していないアイテムを本当に返すことができますか? これは、リスト変更イベントがどのように機能するかについての私の誤解ですか、それとも のバグTreeTableViewですか?

通常、私は標準ライブラリのせいにするのを躊躇しますが、JavaFX で見つけたバグはこれが初めてではないので、考えられないことではありません。


アップデート

への呼び出しを追加するとsetShowRoot(false)、動作が変わります。予想どおりの結果が得られました。削除は2つの部分に分かれています。

{ [TreeItem [ value: Node 1 ]] removed at 0, [TreeItem [ value: Node 3 ]] removed at 1,  }

また、ここに私のMCVEがあります:

import java.util.*;

import javafx.application.*;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.*;

public class TreeTableSelectionEvents extends Application {
    public void start(Stage stage) {
        // Root node.
        TreeItem<String> root = new TreeItem<>("Root");

        root.setExpanded(true);

        root.getChildren().setAll(Arrays.asList(
            new TreeItem<>("Node 1"),
            new TreeItem<>("Node 2"),
            new TreeItem<>("Node 3")
        ));

        // Single column.
        TreeTableColumn<String, String> column = new TreeTableColumn<>("Column");

        column.setPrefWidth(150);
        column.setCellValueFactory((TreeTableColumn.CellDataFeatures<String, String> p) -> {
            return new ReadOnlyStringWrapper(p.getValue().getValue());
        });

        // Tree table.
        TreeTableView<String> table = new TreeTableView<>(root);

        table.getColumns().add(column);
        table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        // table.setShowRoot(false);

        table.getSelectionModel().getSelectedItems().addListener(
            (ListChangeListener.Change<? extends TreeItem<String>> change) -> {
                System.out.printf("item change = %s, list is now %s%n", change, change.getList());
            }
        );

        table.getSelectionModel().getSelectedIndices().addListener(
            (ListChangeListener.Change<? extends Integer> change) -> {
                System.out.printf("index change = %s, list is now %s%n", change, change.getList());
            }
        );

        // Stage.
        stage.setScene(new Scene(table));
        stage.show();
    }
}
4

1 に答える 1