繁体   English   中英

Java:将节点递归添加到JTree

[英]Java: Recursively adding Nodes to 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);
        }
    }
}
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);
        }
    }
}

好吧,那真的很痛苦。 这是一个“可能的”解决方案。 就我个人而言,我更喜欢直接将一个孩子添加到父级中,而不是将其传递给要添加的方法中,但会伤脑筋

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM