2012-04-04 53 views
4

我想从将从SQL查询中导入的二维对象数组创建JTree。这是SQL表的样子:由SQL查询填充的Java Jtree

这里是对象的样品:

Object[][] table = { 
     {1, 0, "Root"}, //i=0 
     {2, 1, "Node2"}, //i=1 
     {3, 1, "Node3"}, //i=2 
     {4, 1, "Node4"}, //i=3 
     {5, 4, "Node5"}, //i=4 
     {6, 4, "Node6"}, //i=5 
     {7, 4, "Node7"}, //i=6 
     {8, 1, "Node8"}, //i=7 
     {9, 1, "Node9"}, //i=8 
     {10, 9, "Node10"},}; //i=9 

这里是我使用对数组进行排序的逻辑:

for (int i = 0; i < table.length; i++) { 
     for (int j = i; j < table.length; j++) { 
      if (table[i][0] == table[j][1]) { 
       System.out.println(table[i][2].toString() + " is parent of " + table[j][2].toString()); 
      } 
     } 
    } 

这是上面什么在控制台显示:

Root is parent of Node2 
Root is parent of Node3 
Root is parent of Node4 
Root is parent of Node8 
Root is parent of Node9 
Node4 is parent of Node5 
Node4 is parent of Node6 
Node4 is parent of Node7 
Node9 is parent of Node10 

我很努力创建TreeModel,HashTable,对象等,我可以用来创建JTree。

我一直在这个问题上停留了一个多星期,我现在可以真正使用他人的经验。

+3

将代码['Outline'](http://codereview.stackexchange.com/a/4447/6692)是利益? – trashgod 2012-04-04 16:00:32

回答

2

我是Java新手,所以我不得不对这个问题做一些研究。这项研究非常耗时。我发现以下链接具有从SQL数据创建JTree的最佳解决方案。

https://forums.oracle.com/forums/thread.jspa?threadID=2225475

这里是我用于解决问题

class myTree extends JPanel { 

private DefaultMutableTreeNode rootNode; 
private DefaultTreeModel treeModel; 

public myTree() { 

    super(new GridLayout(1, 1)); //Set the layout for the panel that the jtree. 

    //The following object is a sample from a database and was used to validate 
    //the solution below. Make sure the table is properly sorted before you create the 
    //the object from the query. 
    Object[][] table = { 
     {1, null, "Root"}, //i=0 
     {2, 1, "Node2"}, //i=1 
     {3, 2, "Node3"}, //i=2 
     {4, 3, "Node4"}, //i=3 
     {5, 4, "Node5"}, //i=4 
     {6, 5, "Node6"}, //i=5 
     {7, 6, "Node7"}, //i=6 
     {8, 1, "Node8"}, //i=7 
     {9, 1, "Node9"}, //i=8 
     {10, 9, "Node10"},}; //i=9 

    //Create as many nodes as there are rows of data. 
    DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[table.length]; 
    for (int i = 0; i < table.length; i++) { 
     node[i] = new DefaultMutableTreeNode(table[i][2].toString()); 
    } 

    rootNode = node[0]; //Set the root node 

    //Cycle through the table above and assign nodes to nodes 
    for (int i = 0; i < table.length; i++) { 
     for (int j = 1; j < table.length; j++) { 
      if (table[i][0] == table[j][1]) { 
       System.out.println(table[i][2].toString() + " is parent of " + table[j][2].toString()); 
       node[i].add(node[j]); 
      } 
     } 
    } 
    //Creating the tree model. setting the root node. 
    treeModel = new DefaultTreeModel(rootNode); 
    //Setting the tree model to the JTree 
    JTree tree = new JTree(treeModel); 
    //adding the tree to the JPanel 
    add(tree); 
} 
2

整理数据到这些列:

CREATE TABLE tree_node 
(NodeID int, 
ParentID int, 
Value varchar(250) 
...) //as many values per node as you want 

这将允许您遍历记录并填充JTree的。

看看depth firstbreadth first树遍历。

+0

我对表格的计划做了一个快速的模拟,发现它比我计划的更有效地管理数据。我会相应地修改我的表格和数据。我查看了深度/呼吸第一棵树遍历方法。我把这个算法放在了正确的方向。现在我只需要更多关于树构造函数的信息就会最好。 JTree(Vector),JTree(HashTable),JTree(TreeModel)等。 – ForgottenKahz 2012-04-04 17:07:16

+1

请查看此[链接](http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#create )。我会去使用DefaultMutableTreeNode的构造函数。当您先用depth或first first search遍历树时,将节点添加到根DefaultMutableTreeNode。 – eabraham 2012-04-04 17:30:28

+0

我真的很努力地从查询中得到数组,并将它们转化为父节点,然后在这些节点上放置更多节点,等等。我很确定TreeModel是实现数据的方式,但不知道如何填充TreeModel以反映数据库中的数据。 – ForgottenKahz 2012-04-06 01:02:03