从JTree中的文本文件动态填充树模型 [英] Dynamically populating the tree model from a text file in JTree

查看:158
本文介绍了从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);
文件f1 =新建文件(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(添加到根节点);
rootNode.add(treeNode);
//System.out.println(\" addded 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);

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

解决方案

这可能有点清洁。只需调整计算级别的功能...

  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));
字符串;

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();
返回rootNode;
}

private static final int getLevel(String line){

int level = 0; (int i = 0; i< line.length(); i ++){
char c = line.charAt(i);

if(c =='\t'){
level ++;
}
else {
break;
}
}
返回级别;
}

private static final String getNodeName(String line,int level){
return line.substring(level);
}


The problem I am facing is with the tree model of the JTree.

I have defined the root node as:

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

When the application first starts, I want the treeModel to be created and loaded. For this, I am using a file meta.txt, which has information like the following:

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

The first column is the level, and the second is the node of the tree. Now based on this information, I want to create the tree model, but am facing a roadblock here.

I am unsure of the logic to apply to add the above nodes to the root node. Every thing I have tried seems to have flaws. The problem here is the no of levels are not fixed, so I cant simply use a if-else construct. I am using the following code:

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

This seems to be working fine, but could anyone please tell me if this is the correct approach?

解决方案

This might be a bit cleaner. Just adapt the function for calculating the level ...

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

这篇关于从JTree中的文本文件动态填充树模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆