Как получить элементы TreeView в виде списка

#javafx #javafx-2 #javafx-8

#javafx #javafx-2 #javafx-8

Вопрос:

Есть ли способ получить узлы элементов в виде списка из JavaFX TreeView?

 TreeView<String> treeView = new TreeView<>(treeItemRoot);
 

Например, я хотел бы получить компоненты в HashMap.

Ответ №1:

Вот один из возможных способов. Вместо использования строки я создал пользовательский объект, в котором вы можете хранить некоторые свойства. Я установил, был ли это заголовок или нет, и заголовок. Затем я просматриваю узлы, и если это не заголовок, я добавляю их в HashMap. Вы можете добавить элементы заголовка на карту или что угодно.

Код

 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);
    }
}