如何使用 JTree 从文件创建树视图?

How to make a tree view from a file using JTree?

我有一个文件 abc.csv,它是我的 bom(material 的清单)文件。我需要使用该文件使用 Jtree 制作树视图。我的文件有这样的数据:

PARENT_NAME     QUANTITY        COMPONENT_NAME
HOLDER          1               BODY
HOLDER          1               PTRY_GASKET
HOLDER          1               PTRY
HOLDER          1               DISC
HOLDER          1               GUIDE_SET
HOLDER          1               STEM
HOLDER          1               COV_FLG
HOLDER          1               FOLLOW_FLG

.... other entries here

这是我在 gist 中的完整文件,因为它是一个非常大的文件,所以我无法将其粘贴到这里。

自从我最近开始使用 JTree,所以我有点搞不清楚它是如何工作的。到目前为止我得到了以下代码:

public static void main(String[] args) {
    JFrame frame = new JFrame("FileTree");
    frame.setForeground(Color.black);
    frame.setBackground(Color.lightGray);
    Container cp = frame.getContentPane();

    if (args.length == 0) {
        cp.add(new FileTree(new File("abc.csv")));
    }

    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public FileTree(File dir) {
    setLayout(new BorderLayout());

    // Now how do I make a tree list with all the nodes, and make it a JTree from my bom

}

您可以根据 DefaultTreeModel 创建自定义 TreeModel 并用您的数据填充它,如下例所示:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

@SuppressWarnings("serial")
public class FileTree extends JFrame
{
    private JTree tree;
    private Path path;

    public FileTree(Path path)
    {
        this.path = path;
        setTitle("File Tree");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initializeComponents();
        pack();
        setVisible(true);
    }

    public void initializeComponents()
    {
        try
        {
            tree = new JTree(new CustomTreeModel(
                    new DefaultMutableTreeNode("Data"), path));
        }
        catch (IOException e)
        {
            JOptionPane.showMessageDialog(this,
                    "Error while reading input file.", "error",
                    JOptionPane.ERROR_MESSAGE);
        }
        tree.setRootVisible(false);
        add(new JScrollPane(tree));
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(
                            "javax.swing.plaf.nimbus.NimbusLookAndFeel");
                }
                catch (ClassNotFoundException | InstantiationException
                        | IllegalAccessException
                        | UnsupportedLookAndFeelException e)
                {
                }
                String path = "/home/mohamed/Desktop/abc.csv";
                if (args.length > 0)
                {
                    path = args[0];
                }
                new FileTree(Paths.get(path));
            }
        });
    }
}

class CustomTreeModel extends DefaultTreeModel
{
    private static final long serialVersionUID = -274517614354269449L;

    public CustomTreeModel(TreeNode root, Path path) throws IOException
    {
        super(root);
        try (BufferedReader br = new BufferedReader(
                new FileReader(path.toFile())))
        {
            String s = null;
            DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) root;
            int skipFirstLine = -1;
            List<String> items = new ArrayList<>();

            DefaultMutableTreeNode parentName;
            DefaultMutableTreeNode quantity;
            DefaultMutableTreeNode componentName;

            while ((s = br.readLine()) != null)
            {
                if (skipFirstLine == -1)
                {
                    skipFirstLine = 0;
                    continue;
                }

                items.addAll(Arrays.asList(s.split("\s")));
                items.removeAll(Arrays.asList(""));

                if (items.size() == 3)
                {
                    parentName = new DefaultMutableTreeNode(items.get(0));
                    parentName.setAllowsChildren(false);
                    quantity = new DefaultMutableTreeNode(items.get(1));
                    quantity.setAllowsChildren(false);
                    componentName = new DefaultMutableTreeNode(items.get(2));

                    componentName.add(parentName);
                    componentName.add(quantity);

                    rootNode.add(componentName);
                }
                items.clear();
            }
            setRoot(rootNode);
        }
        catch (IOException e)
        {
            throw e;
        }
    }
}

结果如下: