[英]Dynamically populating the tree model from a text file in 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);
这似乎工作正常,但是有人可以告诉我这是否正确吗?
这可能会更清洁一些。 只需调整用于计算水平的功能...
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);
}
有一个github项目,如果有帮助的话,可以从数据集合中创建TreeModels。
下面的示例是从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);
假设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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.