create JTree to nth level

43 Views Asked by At

It might be simple but I am stuck with it from last few hours that I need to create the JTree to nth level as per database records. The below code add the childs till level 1, I don't know how can i add subchilds to the nth level, as database comes with parentID of childs.

private DefaultMutableTreeNode setSandboxJTreeModel() {
    try {
        sandboxJTreeRootNode = new DefaultMutableTreeNode(AppConstants.SANDBOX_TREE_NAME);
        //sandboxJTreeModel = new DefaultTreeModel(sandboxJTreeRootNode);
        ArrayList<tbl_bom_sandbox> sandboxArray = daoSandboxObject.fetchAllSandboxRoutes();
        
        DefaultMutableTreeNode parentNode = new DefaultMutableTreeNode(sandboxArray.get(0).getRouteName());
        sandboxJTreeRootNode.add(parentNode);
        
        for (int item = 1; item < sandboxArray.size(); item++) {
            DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(sandboxArray.get(item).getInFeedItemName());
            parentNode.add(childNode);
        }
        
        
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sandboxJTreeRootNode;
}

Current output of code in picture as well as the expected output.

enter image description here

1

There are 1 best solutions below

0
MadProgrammer On BEST ANSWER

The data structure is exactly same as shown in picture, depth of tree will varies depending upon the no of records.

So, conceptually, you want to append the child node to the previous child node.

This could be done using a simple recursive method, simular to...

protected void populate(DefaultMutableTreeNode parent, List<String> items, int index) {
    if (index >= items.size()) {
        return;
    }
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(items.get(index));
    parent.add(node);
    populate(node, items, ++index);
}

or even more directly via a simple for-loop...

DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(items.get(0));
DefaultMutableTreeNode parentNode = rootNode;
for (int index = 1; index < items.size(); index++) {
    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(items.get(index));
    parentNode.add(childNode);
    parentNode = childNode;
}

Runnable example

enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() throws IOException {
            setLayout(new BorderLayout());
            JTree tree = new JTree();
            tree.setShowsRootHandles(true);

            List<String> items = new ArrayList<>(32);
            items.add("Bill of materials (BOM) SANDBOX");
            items.add("00550R1020AROI_Straightening");
            items.add("00815R1214ARPP");
            items.add("01400R1030ARDWN");
            items.add("01400R1030ARDWN");

            DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(items.get(0));
            populate(rootNode, items, 1);

            DefaultTreeModel model = new DefaultTreeModel(rootNode);
            tree.setModel(model);

            add(new JScrollPane(tree));
        }

        protected void populate(DefaultMutableTreeNode parent, List<String> items, int index) {
            if (index >= items.size()) {
                return;
            }
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(items.get(index));
            parent.add(node);
            populate(node, items, ++index);
        }
    }
}