【问题标题】:Java Jtree populated by SQL query由 SQL 查询填充的 Java Jtree
【发布时间】:2012-04-18 07:58:04
【问题描述】:

我想从一个二维对象数组创建一个 JTree,我将从 SQL 查询中导入该数组。这是 SQL 表的样子:

这是对象的示例:

    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

我正在努力创建可用于创建 JTree 的 TreeModel、HashTable、Object 等。

我已经被这个问题困扰了一个多星期,现在我真的可以借鉴其他人的经验。

【问题讨论】:

标签: java swing hashtable jtree treemodel


【解决方案1】:

将您的数据组织到这些列中:

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

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

看看depth firstbreadth first 树遍历。

【讨论】:

  • 我快速模拟了您的表格计划,发现它管理数据的效率比我计划的要高得多。我将相应地修改我的表格和数据。我查看了深度/呼吸优先树遍历方法。我为算法设定了正确的方向。现在我只需要更多关于树构造函数的信息会最有效。 JTree(Vector)、JTree(HashTable)、JTree(TreeModel)等
  • 看看这个link。我会选择使用 DefaultMutableTreeNode 的构造函数。当您使用深度优先或呼吸优先搜索遍历树时,将节点添加到根 DefaultMutableTreeNode。
  • 我真的很难从查询中获取数组并将它们变成父节点的节点,然后在这些节点上放置更多节点等等。我很确定 TreeModel 是实现数据的方式,但不确定如何填充 TreeModel 以反映数据库中的数据。
  • 首先在 SQL 中进行所有排序。它经过优化,比您编写的任何算法都好得多。看看这个link,了解如何递归地创建一棵树。
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2021-01-04
    • 2017-09-18
    相关资源
    最近更新 更多