【问题标题】:Dynamically populating the tree model from a text file in JTree从 JTree 中的文本文件动态填充树模型
【发布时间】:2013-08-28 08:42:36
【问题描述】:

我面临的问题是 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);

这似乎工作正常,但谁能告诉我这是否是正确的方法?

【问题讨论】:

  • 显示您尝试过的(作为 SSCCE)以及它究竟如何没有按您的预期工作
  • 添加了实现代码,目前工作正常,但不确定这是否是更聪明的方法。

标签: java swing dynamic jtree defaulttreemodel


【解决方案1】:

这可能会更干净一些。只需调整计算级别的函数...

public static final DefaultMutableTreeNode getTreeNode(File file) throws IOException  {

    DefaultMutableTreeNode rootNode = null;
    Map<Integer, DefaultMutableTreeNode> levelNodes = new HashMap<Integer, DefaultMutableTreeNode>();
    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);
}      

【讨论】:

    【解决方案2】:

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

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

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

    假设书在同一个包中,看起来像......

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多