如何将TreeView项目作为列表

时间:2014-06-20 20:39:04

标签: javafx javafx-2 javafx-8

有没有办法从JavaFX TreeView获取Item节点作为列表?

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

例如,我想将组件放入HashMap。

1 个答案:

答案 0 :(得分:1)

这是一种可能的方式。我创建了一个自定义对象,而不是使用String,您可以在其中保存一些属性。我设置它是否是标题和标题。然后我浏览节点,如果它不是标题,我将它们添加到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);
    }
}