2016-01-22 79 views
0

我有一个文件abc.csv这是我的BOM(物料清单)文件。我需要使用该文件来使用Jtree创建树视图。我的文件有数据是这样的:如何使用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

为[示例](http://stackoverflow.com/a/34224804/230513)创建一个包含解析数据的'TreeModel'。 – trashgod

回答

1

你可以根据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; 
     } 
    } 
} 

结果如下:

enter image description here

+0

谢谢你的好例子。截至目前,我仍然在Java 7中,它看起来像一些代码使用Java 8,但我还不熟悉。 :( – john

+0

@david查看更新的代码。 –