从JTree中的文本文件动态填充树模型

我面临的问题是JTree的树模型。

我已将根节点定义为:

javax.swing.tree.DefaultMutableTreeNode rootNode = new javax.swing.tree.DefaultMutableTreeNode(projectName); 

当应用程序首次启动时,我希望创建并加载treeModel。 为此,我使用的是meta.txt文件,其中包含以下信息:

  1QuotesPrice.Job 2QuotesPrice.Df 1Quotes.Job 2Quotes.Wf 3Quotes.Df 2Falkeblang.Wf 3Falkeblang.Df 

第一列是级别,第二列是树的节点。 现在根据这些信息,我想创建树模型,但我在这里遇到了障碍。

我不确定应用于将上述节点添加到根节点的逻辑。 我尝试的每一件事似乎都有缺陷。 这里的问题是没有修复级别,所以我不能简单地使用if-else结构。 我使用以下代码:

  String treeMeta=this.projectsDir+"\\"+projectName+"\\"+"meta.txt"; DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(projectName); File f1=new File(treeMeta); inputStream = new Scanner(f1); while(inputStream.hasNext()){ String val=inputStream.next(); System.out.println("!@#$%"+val+"!@#$%"); treeNodePrev=treeNode; prevLevel=level; level=val.substring(0,1); nodeVal=val.substring(1); if(level.equals("1")){ prevNode=projectName; treeNode = new DefaultMutableTreeNode(nodeVal); System.out.println("added to root node"); rootNode.add(treeNode); //System.out.println("added to root node"); }else if(Integer.parseInt(level)>Integer.parseInt(prevLevel)){ prevNode=nodeVal; treeNode = new DefaultMutableTreeNode(nodeVal); treeNodePrev.add(treeNode); }else if(Integer.parseInt(level)==Integer.parseInt(prevLevel)){ prevNode=nodeVal; treeNode = new DefaultMutableTreeNode(nodeVal); prevParentTreeNode=(DefaultMutableTreeNode)treeNodePrev.getParent(); //System.out.println(prevParentTreeNode.getParent().toString()); prevParentTreeNode.add(treeNode); } } jProjectTree.setModel(new javax.swing.tree.DefaultTreeModel(rootNode)); jScrollPane2.setViewportView(jProjectTree); 

这似乎工作正常,但任何人都可以告诉我,这是否是正确的方法?

这可能会更清洁一些。 只需调整计算级别的function……

 public static final DefaultMutableTreeNode getTreeNode(File file) throws IOException { DefaultMutableTreeNode rootNode = null; Map levelNodes = new HashMap(); BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while( (line = reader.readLine()) != null ) { int level = getLevel(line); String nodeName = getNodeName(line, level); DefaultMutableTreeNode node = new DefaultMutableTreeNode(nodeName); levelNodes.put(level, node); DefaultMutableTreeNode parent = levelNodes.get(level - 1); if( parent != null ) { parent.add(node); } else { rootNode = node; } } reader.close(); return rootNode; } private static final int getLevel(String line) { int level = 0; for ( int i = 0; i < line.length(); i++ ) { char c = line.charAt(i); if( c == '\t') { level++; } else { break; } } return level; } private static final String getNodeName(String line, int level) { return line.substring(level); } 

有一个github项目,如果有帮助,可以从数据集合中创建TreeModel。

下面的示例从Book对象列表构建TreeModel。

 List bookList = new ArrayList<>(); CollectionTreeModel treeModel = new CollectionTreeModel .Builder<>(bookList) .addNode(b -> b.publisher) .addNode(b -> b.author) .addNode(b -> b.title) .build(); JTree jTree = new JTree(treeModel); 

假设Book在同一个包中,看起来像……

 public class Book { final String publisher; final String author; final String title; Book(String publisher, String author, String title) { ... } } 

欲了解更多信息:

https://github.com/mnrussell/collectionTreeModel

有点迟,但希望这会有所帮助:o)

Interesting Posts