-
Bug
-
Resolution: Unresolved
-
P4
-
8, 9
-
generic
-
generic
FULL PRODUCT VERSION :
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) Client VM (build 25.102-b14, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [version 10.0.10586]
A DESCRIPTION OF THE PROBLEM :
Call of TreeItem getchildren() during column sort cause Exception.
tree.getSelectionModel().getSelectedItems().addListener((ListChangeListener.Change<? extends TreeItem<Map<String, Object>>> c) -> {
while (c.next()) {
if (c.wasAdded()) {
System.out.println("bug : " + c.getAddedSubList());
c.getAddedSubList().forEach((item) -> System.out.println("bug origin: " + item.getChildren()));
}
}
});
add a listchangelistener to the selecteditems and call getchildren on a treeitem in the listener
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
With the application provided select Europe and sort region column
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136)
at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:242)
at tableview.TreeTableViewDragAndDropDemo1.lambda$start$1(TreeTableViewDragAndDropDemo1.java:38)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class TreeTableViewSelectedItemsDemo extends Application {
private TreeItem<Map<String, Object>> root;
private TreeTableView<Map<String, Object>> tree;
@Override
public void start(Stage primaryStage) throws Exception {
VBox outer = new VBox();
root = new TreeItem<>();
tree = new TreeTableView<>(root);
tree.setShowRoot(false);
tree.setRowFactory(this::rowFactory);
addColumn("Region", "region");
addColumn("Type", "type");
addColumn("Pop.", "population");
setupData();
tree.getSelectionModel().getSelectedItems().addListener((ListChangeListener.Change<? extends TreeItem<Map<String, Object>>> c) -> {
while (c.next()) {
if (c.wasAdded()) {
System.out.println("bug : " + c.getAddedSubList());
c.getAddedSubList().forEach((item) -> System.out.println("bug origin: " + item.getChildren()));
}
}
});
outer.getChildren().addAll(tree);
Scene scene = new Scene(outer, 640, 480);
primaryStage.setScene(scene);
primaryStage.show();
}
private TreeTableRow<Map<String, Object>> rowFactory(TreeTableView<Map<String, Object>> view) {
TreeTableRow<Map<String, Object>> row = new TreeTableRow<>();
return row;
}
private void setupData() {
TreeItem<Map<String, Object>> europe = createItem(root, "Europe", "continent", 742500000L);
TreeItem<Map<String, Object>> austria = createItem(europe, "Austria", "country", 847400L);
createItem(austria, "Tyrol", "state", 728537L);
createItem(europe, "Russia ", "country", 144031000);
createItem(europe, "Germany ", "country", 81276000);
createItem(europe, "Turkey ", "country", 78214000);
createItem(europe, "France ", "country", 67063000);
createItem(europe, "Italy ", "country", 60963000);
createItem(europe, "Spain ", "country", 46335000);
createItem(europe, "Ukraine ", "country", 42850000);
createItem(europe, "Poland ", "country", 38494000);
createItem(europe, "Romania ", "country", 19822000);
createItem(europe, "Kazakhstan ", "country", 17543000);
createItem(europe, "Netherlands ", "country", 16933000);
createItem(europe, "Belgium ", "country", 11259000);
createItem(europe, "Greece ", "country", 10769000);
createItem(europe, "Portugal ", "country", 10311000);
createItem(europe, "Hungary ", "country", 9835000);
createItem(europe, "Sweden ", "country", 9794000);
createItem(europe, "Azerbaijan ", "country", 9651000);
createItem(europe, "Belarus ", "country", 9481000);
createItem(europe, "Switzerland ", "country", 8265000);
createItem(europe, "Bulgaria ", "country", 7185000);
createItem(europe, "Serbia ", "country", 7103000);
createItem(europe, "Denmark ", "country", 5673000);
createItem(europe, "Finland ", "country", 5475000);
createItem(europe, "Slovakia ", "country", 5426000);
createItem(europe, "Norway ", "country", 5194000);
createItem(europe, "Ireland ", "country", 4630000);
createItem(europe, "Croatia ", "country", 4230000);
createItem(europe, "Bosnia and Georgia ", "country", 3707000);
createItem(europe, "Moldova ", "country", 3564000);
createItem(europe, "Armenia ", "country", 3010000);
createItem(europe, "Lithuania ", "country", 2906000);
createItem(europe, "Albania ", "country", 2887000);
createItem(europe, "Macedonia ", "country", 2071000);
createItem(europe, "Slovenia ", "country", 2065000);
createItem(europe, "Latvia ", "country", 1979000);
createItem(europe, "Kosovo ", "country", 1867000);
createItem(europe, "Estonia ", "country", 1315000);
createItem(europe, "Cyprus ", "country", 876000);
createItem(europe, "Montenegro ", "country", 620000);
createItem(europe, "Luxembourg ", "country", 570000);
createItem(europe, "Transnistria ", "country", 505153);
createItem(europe, "Malta ", "country", 425000);
createItem(europe, "Iceland ", "country", 331000);
createItem(europe, "Jersey (UK) ", "country", 103000);
createItem(europe, "Andorra ", "country", 78000);
createItem(europe, "Guernsey (UK) ", "country", 66000);
createItem(europe, "Liechtenstein ", "country", 37000);
createItem(europe, "Monaco ", "country", 37000);
TreeItem<Map<String, Object>> america = createItem(root, "America", "continent", 953700000L);
createItem(america, "USA", "country", 318900000L);
createItem(america, "Mexico", "country", 122300000L);
}
private TreeItem<Map<String, Object>> createItem(TreeItem<Map<String, Object>> parent, String region, String type, long population) {
TreeItem<Map<String, Object>> item = new TreeItem<>();
Map<String, Object> value = new HashMap<>();
value.put("region", region);
value.put("type", type);
value.put("population", population);
item.setValue(value);
parent.getChildren().add(item);
item.setExpanded(true);
return item;
}
protected void addColumn(String label, String dataIndex) {
TreeTableColumn<Map<String, Object>, String> column = new TreeTableColumn<>(label);
column.setPrefWidth(150);
column.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<Map<String, Object>, String> param) -> {
ObservableValue<String> result = new ReadOnlyStringWrapper("");
if (param.getValue().getValue() != null) {
result = new ReadOnlyStringWrapper("" + param.getValue().getValue().get(dataIndex));
}
return result;
}
);
tree.getColumns().add(column);
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) Client VM (build 25.102-b14, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [version 10.0.10586]
A DESCRIPTION OF THE PROBLEM :
Call of TreeItem getchildren() during column sort cause Exception.
tree.getSelectionModel().getSelectedItems().addListener((ListChangeListener.Change<? extends TreeItem<Map<String, Object>>> c) -> {
while (c.next()) {
if (c.wasAdded()) {
System.out.println("bug : " + c.getAddedSubList());
c.getAddedSubList().forEach((item) -> System.out.println("bug origin: " + item.getChildren()));
}
}
});
add a listchangelistener to the selecteditems and call getchildren on a treeitem in the listener
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
With the application provided select Europe and sort region column
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136)
at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:242)
at tableview.TreeTableViewDragAndDropDemo1.lambda$start$1(TreeTableViewDragAndDropDemo1.java:38)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
public class TreeTableViewSelectedItemsDemo extends Application {
private TreeItem<Map<String, Object>> root;
private TreeTableView<Map<String, Object>> tree;
@Override
public void start(Stage primaryStage) throws Exception {
VBox outer = new VBox();
root = new TreeItem<>();
tree = new TreeTableView<>(root);
tree.setShowRoot(false);
tree.setRowFactory(this::rowFactory);
addColumn("Region", "region");
addColumn("Type", "type");
addColumn("Pop.", "population");
setupData();
tree.getSelectionModel().getSelectedItems().addListener((ListChangeListener.Change<? extends TreeItem<Map<String, Object>>> c) -> {
while (c.next()) {
if (c.wasAdded()) {
System.out.println("bug : " + c.getAddedSubList());
c.getAddedSubList().forEach((item) -> System.out.println("bug origin: " + item.getChildren()));
}
}
});
outer.getChildren().addAll(tree);
Scene scene = new Scene(outer, 640, 480);
primaryStage.setScene(scene);
primaryStage.show();
}
private TreeTableRow<Map<String, Object>> rowFactory(TreeTableView<Map<String, Object>> view) {
TreeTableRow<Map<String, Object>> row = new TreeTableRow<>();
return row;
}
private void setupData() {
TreeItem<Map<String, Object>> europe = createItem(root, "Europe", "continent", 742500000L);
TreeItem<Map<String, Object>> austria = createItem(europe, "Austria", "country", 847400L);
createItem(austria, "Tyrol", "state", 728537L);
createItem(europe, "Russia ", "country", 144031000);
createItem(europe, "Germany ", "country", 81276000);
createItem(europe, "Turkey ", "country", 78214000);
createItem(europe, "France ", "country", 67063000);
createItem(europe, "Italy ", "country", 60963000);
createItem(europe, "Spain ", "country", 46335000);
createItem(europe, "Ukraine ", "country", 42850000);
createItem(europe, "Poland ", "country", 38494000);
createItem(europe, "Romania ", "country", 19822000);
createItem(europe, "Kazakhstan ", "country", 17543000);
createItem(europe, "Netherlands ", "country", 16933000);
createItem(europe, "Belgium ", "country", 11259000);
createItem(europe, "Greece ", "country", 10769000);
createItem(europe, "Portugal ", "country", 10311000);
createItem(europe, "Hungary ", "country", 9835000);
createItem(europe, "Sweden ", "country", 9794000);
createItem(europe, "Azerbaijan ", "country", 9651000);
createItem(europe, "Belarus ", "country", 9481000);
createItem(europe, "Switzerland ", "country", 8265000);
createItem(europe, "Bulgaria ", "country", 7185000);
createItem(europe, "Serbia ", "country", 7103000);
createItem(europe, "Denmark ", "country", 5673000);
createItem(europe, "Finland ", "country", 5475000);
createItem(europe, "Slovakia ", "country", 5426000);
createItem(europe, "Norway ", "country", 5194000);
createItem(europe, "Ireland ", "country", 4630000);
createItem(europe, "Croatia ", "country", 4230000);
createItem(europe, "Bosnia and Georgia ", "country", 3707000);
createItem(europe, "Moldova ", "country", 3564000);
createItem(europe, "Armenia ", "country", 3010000);
createItem(europe, "Lithuania ", "country", 2906000);
createItem(europe, "Albania ", "country", 2887000);
createItem(europe, "Macedonia ", "country", 2071000);
createItem(europe, "Slovenia ", "country", 2065000);
createItem(europe, "Latvia ", "country", 1979000);
createItem(europe, "Kosovo ", "country", 1867000);
createItem(europe, "Estonia ", "country", 1315000);
createItem(europe, "Cyprus ", "country", 876000);
createItem(europe, "Montenegro ", "country", 620000);
createItem(europe, "Luxembourg ", "country", 570000);
createItem(europe, "Transnistria ", "country", 505153);
createItem(europe, "Malta ", "country", 425000);
createItem(europe, "Iceland ", "country", 331000);
createItem(europe, "Jersey (UK) ", "country", 103000);
createItem(europe, "Andorra ", "country", 78000);
createItem(europe, "Guernsey (UK) ", "country", 66000);
createItem(europe, "Liechtenstein ", "country", 37000);
createItem(europe, "Monaco ", "country", 37000);
TreeItem<Map<String, Object>> america = createItem(root, "America", "continent", 953700000L);
createItem(america, "USA", "country", 318900000L);
createItem(america, "Mexico", "country", 122300000L);
}
private TreeItem<Map<String, Object>> createItem(TreeItem<Map<String, Object>> parent, String region, String type, long population) {
TreeItem<Map<String, Object>> item = new TreeItem<>();
Map<String, Object> value = new HashMap<>();
value.put("region", region);
value.put("type", type);
value.put("population", population);
item.setValue(value);
parent.getChildren().add(item);
item.setExpanded(true);
return item;
}
protected void addColumn(String label, String dataIndex) {
TreeTableColumn<Map<String, Object>, String> column = new TreeTableColumn<>(label);
column.setPrefWidth(150);
column.setCellValueFactory(
(TreeTableColumn.CellDataFeatures<Map<String, Object>, String> param) -> {
ObservableValue<String> result = new ReadOnlyStringWrapper("");
if (param.getValue().getValue() != null) {
result = new ReadOnlyStringWrapper("" + param.getValue().getValue().get(dataIndex));
}
return result;
}
);
tree.getColumns().add(column);
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------