Change listener not notified when tree item is deselected
885593May 21 2012 — edited May 21 2012I'm attaching a listener to the selected index property of the tree view selection model to detect when a user selects or deselects on or more nodes in a tree, but it appears that the listener is not notified when a user deselects a node. So if a user selects two nodes and then while holding down the Ctrl key deselects one of the selected nodes the tree view control deselects the node, but the change listener is not notified. Is this is a bug or am I doing something wrong?
I’m using the GA version of JavaFX 2.1 on Windows 7.
Thanks.
Stefan
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TreeViewSample extends Application {
private final Node rootIcon = new ImageView(
new Image(getClass().getResourceAsStream("Folder.gif"))
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage)
{
primaryStage.setTitle("Tree View Sample");
TreeItem<String> rootItem = new TreeItem<String> ("Inbox", rootIcon);
rootItem.setExpanded(true);
for (int i = 1; i < 6; i++)
{
TreeItem<String> item = new TreeItem<String> ("Message" + i);
rootItem.getChildren().add(item);
}
TreeView<String> tree = new TreeView<String> (rootItem);
tree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tree.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>()
{
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldIndex, Number newIndex)
{
System.out.println("selection changed");
}
});
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}