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

时间:2016-01-22 04:12:10

标签: java swing jtree

我有一个文件abc.csv,这是我的bom(物料清单)文件。我需要使用该文件使用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

}

1 个答案:

答案 0 :(得分:1)

您可以根据TreeModel创建自定义DefaultTreeModel,并将其填入您的数据,如下例所示:

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

结果如下:

enter image description here