1

私が直面している問題は、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

最初の列はレベルで、2 番目の列はツリーのノードです。この情報に基づいて、ツリー モデルを作成したいのですが、ここで障害に直面しています。

上記のノードをルート ノードに追加するために適用するロジックがわかりません。私が試したことにはすべて欠陥があるようです。ここでの問題は、レベル数が固定されていないことです。そのため、単純に 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);

これはうまく機能しているようですが、これが正しいアプローチであるかどうか誰か教えてください。

4

2 に答える 2

0

それが役立つ場合は、データのコレクションから TreeModels を作成するための github プロジェクトがあります。

Book オブジェクトのリストから 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)

于 2015-04-23T12:33:04.903 に答える