私はJavaFX TreeTableViewを持っています。ルートの下には、TreeItem(ノード)のセットがあり、各ノードは独自の子TreeItem(サブノード)を持つことができます。サブノードがないノードには表示される情報がないので、それらを削除したいと思います。しかし、どうにかして単純な削除アクションが選択をいつか変更します。JavaFX TreeItemの削除時にはTreeTableViewの選択が変更される
package sample;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
TreeItem<String> rootNode = new TreeItem<String>("Root");
rootNode.setExpanded(true);
rootNode.getChildren().setAll(new TreeItem<>("Node 0"),
new TreeItem<>("Node 1"), new TreeItem<>("Node 2"),//);
new TreeItem<>("Node 3"), new TreeItem<>("Node 4"));
for (int i = 0; i < 2; i++) {
TreeItem<String> node = rootNode.getChildren().get(i);
node.setExpanded(true);
node.getChildren().setAll(new TreeItem<>("Sub Node " + i + "-0"),
new TreeItem<>("Sub Node " + i + "-1"),
new TreeItem<>("Sub Node " + i + "-2"));
}
TreeTableColumn<String, String> column = new TreeTableColumn<>("Nodes");
column.setCellValueFactory((TreeTableColumn.CellDataFeatures<String, String> p) -> {
return new ReadOnlyStringWrapper(p.getValue().getValue());
});
column.setPrefWidth(200);
TreeTableView<String> table = new TreeTableView<>(rootNode);
table.getColumns().add(column);
int selectIndex = 4;
int removeIndex = 3;
table.getSelectionModel().select(selectIndex);
System.out.println("Selected index = " + table.getSelectionModel().getSelectedIndex());
System.out.println("Selected item = " + table.getSelectionModel().getSelectedItem().getValue());
table.getRoot().getChildren().remove(removeIndex);
System.out.println("Selected index = " + table.getSelectionModel().getSelectedIndex());
System.out.println("Selected item = " + table.getSelectionModel().getSelectedItem().getValue());
primaryStage.setTitle("Tree Table View Selection");
primaryStage.setScene(new Scene(table, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
コードは以下の出力を発生するように:
Selected index = 4
Selected item = Sub Node 0-2
Selected index = 3
Selected item = Sub Node 0-1
(selectedIndexの、removeIndex)は(3,4)に変更された場合は、その後、出力は次のようになる。
Selected index = 3
Selected item = Sub Node 0-1
Selected index = 3
Selected item = Sub Node 0-1
選択したインデックスに変更はありません。
実際、限られたテストケースでは、selectedIndexがremoveIndex以下である限り、removeアクションは選択を変更しません。それ以外の場合は、選択が変更されます。
なぜこのように起こりますか?この問題を回避する方法はありますか?
注意:選択モデルの実装は最適ではありません!明るい側:彼らは改善しています...ゆっくりと)あなたのものはhttps://bugs.openjdk.java.net/browse/JDK-8187596(これはTreeViewに対して報告されました)に関連している可能性があります – kleopatra
@kleopatraこれら2つバグはかなり似ています。彼らは関連する可能性があります。 – Guangliang