Reputation: 1588
Is there a way to get the Item nodes as list from JavaFX TreeView?
TreeView<String> treeView = new TreeView<>(treeItemRoot);
For example I would like to get the components into HashMap.
Upvotes: 1
Views: 4671
Reputation: 421
Here's one possible way. Instead of using a String, I created a custom object where you can hold some properties. I set whether it was a header or not and the title. Then I go through the nodes and if it isn't a header, I add them to the HashMap. You could add the header items to the map or whatever you want.
Code
package application;
import java.util.HashMap;
import java.util.Map;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
Map<String, MyNode> map = new HashMap<String, MyNode>();
@Override
public void start(Stage stage) {
try {
BorderPane border = new BorderPane();
Scene scene = new Scene(border);
stage.setWidth(500);
stage.setHeight(400);
TreeItem<MyNode> rootItem = new TreeItem<MyNode>();
rootItem.setExpanded(true);
rootItem.setValue(new MyNode("Top Header", true));
//Subtree 1
TreeItem<MyNode> subTree1Item = new TreeItem<MyNode>();
subTree1Item.setExpanded(true);
subTree1Item.setValue(new MyNode("Subtree 1", true));
rootItem.getChildren().add(subTree1Item);
for (int i = 1; i < 6; i++) {
TreeItem<MyNode> item = new TreeItem<MyNode>();
item.setValue(new MyNode("Subtree 1 Item "+i, false));
subTree1Item.getChildren().add(item);
}
//Subtree 2
TreeItem<MyNode> subTree2Item = new TreeItem<MyNode>();
subTree2Item.setExpanded(true);
subTree2Item.setValue(new MyNode("Subtree 2", true));
rootItem.getChildren().add(subTree2Item);
for (int i = 1; i < 6; i++) {
TreeItem<MyNode> item = new TreeItem<MyNode>();
item.setValue(new MyNode("Subtree 2 Item "+i, false));
subTree2Item.getChildren().add(item);
}
TreeView<MyNode> tree = new TreeView<MyNode>(rootItem);
//Populate map with leaf nodes
populateMap(rootItem);
//Print map
for(MyNode node : map.values()){
System.out.println(node.getTitle());
}
border.setCenter(tree);
stage.setScene(scene);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
private void populateMap(TreeItem<MyNode> item){
if(item.getChildren().size() > 0){
for(TreeItem<MyNode> subItem : item.getChildren()){
populateMap(subItem);
}
}
else {
MyNode node = (MyNode) item.getValue();
if(!node.isHeader()){
map.put(node.getTitle(), node);
}
}
}
private class MyNode {
boolean header;
String title;
public MyNode(String title, boolean header){
this.title = title;
this.header = header;
}
public boolean isHeader() {
return header;
}
public void setHeader(boolean header) {
this.header = header;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String toString(){
return title;
}
}
public static void main(String[] args) {
launch(args);
}
}
Upvotes: 1