Java:递归地将节点添加到JTree

时间:2012-10-09 02:28:31

标签: java swing recursion nodes jtree

我有2节课。 ErdosStruct包含需要在SimpleTreeEx中进入JTree的所有数据。我正在努力的是编写递归的addNodes()以将erdosStruct中的节点添加到JTree。我对递归没有真正的理解,并建议伙伴们:

if it has no co authors
    return
else
    add the co authors

但我甚至不知道这意味着什么:(

你如何使用递归过度添加节点和子节点到树上?

import java.util.Vector;

/**
 * 
 * @info   The tree data structure. Each node in the tree is of type
 *         AuthNode. The root of the tree contains an AuthNode corresponding to
 *         "Root"
 */
public class ErdosStruct {
    private AuthNode top = new AuthNode("Root");

    public void createStruct() {

        top.addCoAuth(new AuthNode("Node 0"));
        top.addCoAuth(new AuthNode("Node 1"));
        AuthNode coAuth = top.getCoAuth(0); // get Node 0

        // Add to Node 0
        coAuth.addCoAuth(new AuthNode("Node 00"));
        coAuth.addCoAuth(new AuthNode("Node 01"));
        coAuth = coAuth.getCoAuth(0); // get Node 00

        coAuth.addCoAuth(new AuthNode("Node 000"));
        coAuth = coAuth.getCoAuth(0); // get Node 000

        // add to Node 000
        coAuth.addCoAuth(new AuthNode("Node 0000"));
        coAuth.addCoAuth(new AuthNode("Node 0001"));
        coAuth.addCoAuth(new AuthNode("Node 0002"));
        coAuth = coAuth.getCoAuth(2); // get Node 0002

        AuthNode Node0002 = coAuth;

        // add to Node 0002
        coAuth.addCoAuth(new AuthNode("Node 00020"));
        coAuth.addCoAuth(new AuthNode("Node 00021"));
        coAuth.addCoAuth(new AuthNode("Node 00022"));
        coAuth.addCoAuth(new AuthNode("Node 00023"));
        coAuth.addCoAuth(new AuthNode("Node 00024"));
        coAuth.addCoAuth(new AuthNode("Node 00025"));

        /// Other Path

        coAuth = top.getCoAuth(1); // get Node 1
        coAuth.addCoAuth(new AuthNode("Node 10"));
        coAuth = coAuth.getCoAuth(0);

        coAuth.addCoAuth(new AuthNode("Node 100"));
        coAuth = coAuth.getCoAuth(0);

        coAuth.addCoAuth(new AuthNode("Node 1000"));
        coAuth = coAuth.getCoAuth(0);
    }

    /**
     * @return the root element of type AuthNode of the tree data structure
     */
    public AuthNode getRoot() {
        return top;
    }
}

/**
 * @info  AuthNode structure and the interfaces
 */
class AuthNode {
    /**
     * Each AuthNode has a name and a vector of AuthNodes corresponding to co-authors
     */
    private String name;
    private Vector<AuthNode> coAuths = new Vector<AuthNode>();

    /**
     * Two types of constructor
     */
    public AuthNode() {
    }

    public AuthNode(String n) {
        name = n;
    }

    // Self-explanatory interfaces
    public void setName(String n) {
        name = n;
    }

    public String getName() {
        return name;
    }

    // Understand the usage of toString
    public String toString() {
        return name;
    }

    public int getCoAuthCount() {
        return coAuths.size();
    }

    public void addCoAuth(AuthNode coAuthor) {
        coAuths.addElement(coAuthor);
    }

    public AuthNode getCoAuth(int i) {
        return (AuthNode) coAuths.get(i);
    }
}

import java.awt.BorderLayout;
import java.awt.Dimension;   
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;

/**
 * 
 * @info   Main window of the UI - mainFrame of type JFrame contains ErdosStructurePanel of type JPanel
 */
public class SimpleTreeEx extends JFrame {
    public static void main(String[] args) {
        /**
         * erdosStruct contains a tree where node of the tree represents a
         * computer scientist - there is an edge from one node to another if the
         * computer scientists associated to these nodes have co-authored a
         * scientific article (See createStruct method in ErdosStruct class for
         * details)
         */
        ErdosStruct erdosStruct = new ErdosStruct();
        erdosStruct.createStruct();

        SimpleTreeEx mainFrame = new SimpleTreeEx();
        /**
         * ErdosStructPanel constructor takes a parameter of type ErdosStruct
         */
        mainFrame.getContentPane().add(new ErdosStructPanel(erdosStruct));

        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class ErdosStructPanel extends JPanel {
    /**
     * @info    contains the tree data structure with information on co-authorship relations
     */
    public ErdosStructPanel(ErdosStruct erdosStruct) {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(erdosStruct.getRoot());
        DefaultTreeModel tModel = new DefaultTreeModel(root);

        JTree tree = new JTree(tModel);
        tree.setShowsRootHandles(true);
        JScrollPane scroll = new JScrollPane(tree);
        add(scroll, BorderLayout.CENTER);
    }

    private void addNodes(ErdosStruct erdosStruct, DefaultTreeModel tModel) {
        if (erdosStruct.getRoot().getCoAuthCount() == 0) {
            return;
        } else {
            erdosStruct.getRoot().getCoAuth(0)
            tModel.insertNodeInto(new DefaultMutableTreeNode(), (MutableTreeNode) tModel.getRoot(), 0);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

private void addNodes(ErdosStruct erdosStruct, DefaultTreeModel tModel) {
    if (erdosStruct.getRoot().getCoAuthCount() == 0) {
        return;
    } else {
        AuthNode node = erdosStruct.getRoot();
        addNodes(node, tModel, (MutableTreeNode) tModel.getRoot());
    }
}

protected void addNodes(AuthNode node, DefaultTreeModel tModel, MutableTreeNode parent) {
    if (node != null) {
        MutableTreeNode newParent = new DefaultMutableTreeNode(node);
        tModel.insertNodeInto(newParent, parent, parent.getChildCount() - 1);
        for (int index = 0; index < node.getCoAuthCount(); index++) {
            AuthNode child = node.getCoAuth(index);
            addNodes(child, tModel, newParent);
        }
    }
}

好的,那真是太痛苦了。这是一种“可能”的解决方案。就个人而言,我更喜欢直接将一个孩子添加到父母,而不是将其传递给要添加的方法,但是头部疼痛