Делюсь багом. Сегодня откопал. Есть тестовый код.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
static class DummyFilterable {
private String value;
DummyFilterable(String value) {
this.value = value;
}
@Override
public String toString() {
return value.toString();
}
}
public static final int NODE_COUNT = 10;
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Tree View Sample");
TreeView<DummyFilterable> tree = new TreeView(new CheckBoxTreeItem(new DummyFilterable("root")));
tree.getRoot().setExpanded(true);
fillTree2(tree);
StackPane root = new StackPane();
VBox vBox = new VBox();
vBox.getChildren().add(tree);
Button button = new Button("Start");
button.setOnAction(event -> {
if (expandMe.getChildren().contains(removed)) {
expandMe.getChildren().remove(removed);
} else {
expandMe.getChildren().add(removed);
}
});
vBox.getChildren().add(button);
root.getChildren().add(vBox);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private CheckBoxTreeItem<DummyFilterable> expandMe = new CheckBoxTreeItem(new DummyFilterable("expandMe"));
private CheckBoxTreeItem<DummyFilterable> removed = new CheckBoxTreeItem(new DummyFilterable("removed"));
private void fillTree2(TreeView<DummyFilterable> treeView) {
treeView.setCellFactory(p -> new CheckBoxTreeCell());
CheckBoxTreeItem checkBoxTreeItem = null;
for (int i = 0; i < NODE_COUNT; i++) {
checkBoxTreeItem = new CheckBoxTreeItem<>(new DummyFilterable("folder" + i));
treeView.getRoot().getChildren().add(checkBoxTreeItem);
}
checkBoxTreeItem = new CheckBoxTreeItem<>(new DummyFilterable("colapseMe"));
treeView.getRoot().getChildren().add(checkBoxTreeItem);
checkBoxTreeItem.getChildren().add(expandMe);
expandMe.getChildren().add(removed);
expandMe.setExpanded(true);
}
public static void main(String... args) {
launch(args);
}
}
Когда удаляешь ноду removed (нажатием на start) при колапснутой ноде colapseMe и експанднутой expandMe. Селект смещается вверх на 1. Судя по коду не правильно щитается shift в TreeView в treeItemListener (