Java Jtree, заполненный SQL-запросом

Я хотел бы создать 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

Я изо всех сил пытаюсь создать TreeModel, HashTable, Object и т. д., которые я могу использовать для создания JTree.

Я застрял в этой проблеме больше недели, и сейчас я действительно мог бы использовать опыт другого человека.


person ForgottenKahz    schedule 04.04.2012    source источник
comment
Будет ли интересен Outline?   -  person trashgod    schedule 04.04.2012


Ответы (2)


Организуйте свои данные в эти столбцы:

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

Это позволит вам просмотреть набор записей и заполнить JTree.

Взгляните как на сначала в глубину, так и на обход дерева в ширину.

person eabraham    schedule 04.04.2012
comment
Я сделал быстрый макет вашего плана для таблицы и обнаружил, что он управляет данными намного эффективнее, чем я планировал. Я соответствующим образом изменю свою таблицу и данные. Я посмотрел на методологию обхода дерева по глубине/дыханию. Я ставлю меня в правильном направлении для алгоритма. Теперь мне просто нужно больше информации о том, какой конструктор дерева будет работать лучше всего. JTree (вектор), JTree (хеш-таблица), JTree (модель дерева) и т. д. - person ForgottenKahz; 04.04.2012
comment
Взгляните на эту ссылку. Я бы выбрал конструктор, использующий DefaultMutableTreeNode. По мере обхода дерева с поиском в глубину или сначала с дыханием добавляйте узлы к корневому DefaultMutableTreeNode. - person eabraham; 04.04.2012
comment
Я действительно изо всех сил пытаюсь получить массивы, поступающие из запросов, и превратить их в узлы для родителей, а затем разместить больше узлов на этих узлах и так далее. Я почти уверен, что TreeModel — это способ реализации данных, но я не уверен, как заполнить TreeModel, чтобы отразить данные в базе данных. - person ForgottenKahz; 06.04.2012
comment
Сначала сделайте всю свою сортировку в SQL. Он оптимизирован для сортировки намного лучше, чем любой алгоритм, который вы будете кодировать. Взгляните на эту ссылку, чтобы понять, как рекурсивно создать дерево. - person eabraham; 07.04.2012

Я новичок в Java, поэтому мне пришлось провести некоторое исследование этой проблемы. Исследование действительно заняло много времени. Я обнаружил, что по следующей ссылке есть лучшие решения для создания JTree из данных SQL.

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);
}
person ForgottenKahz    schedule 07.04.2012