Java 无法将叶添加到Jtree

Java 无法将叶添加到Jtree,java,swing,jtree,defaulttreemodel,Java,Swing,Jtree,Defaulttreemodel,我想造一棵树,但我不能添加任何叶子,只能添加到根上。 下面是一个例子,你有什么帮助吗? 谢谢,吉安卢卡 import java.awt.Dimension; import java.util.ArrayList; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; im

我想造一棵树,但我不能添加任何叶子,只能添加到根上。 下面是一个例子,你有什么帮助吗? 谢谢,吉安卢卡

import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

public class ExtendePedigree extends JPanel{

private JTree tree;
private static String lineStyle = "Horizontal";
private static boolean useSystemLookAndFeel = false;
private JPanel descPanel;
private JTextField anelloText;
private JTextField varieta;
private int toReturn;


public  ExtendePedigree(String soggetto){
    JDialog extPedigreeJDialog = new JDialog();
    //Create the nodes.
    DefaultMutableTreeNode top =
        new DefaultMutableTreeNode(soggetto);
    createNodes(top,soggetto);
    //Create a tree that allows one selection at a time.
    tree = new JTree(top);
    tree.getSelectionModel().setSelectionMode
            (TreeSelectionModel.SINGLE_TREE_SELECTION);
    //Listen for when the selection changes.
    //tree.addTreeSelectionListener(this);

    //Create the scroll pane and add the tree to it. 
    JScrollPane treeView = new JScrollPane(tree);        
    descPanel = new JPanel();
    //descPane.setEditable(false);
    JLabel anello = new JLabel("Anello");
    anelloText = new JTextField(20);
    JLabel varietaLabel = new JLabel("Descrizione");
    varieta = new JTextField(50);
    descPanel.add(anello);
    descPanel.add(anelloText);
    descPanel.add(varietaLabel);
    descPanel.add(varieta);       
    JScrollPane descView = new JScrollPane(descPanel);
    //Add the scroll panes to a split pane.
    JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    splitPane.setTopComponent(treeView);
    splitPane.setBottomComponent(descView);

    Dimension minimumSize = new Dimension(1024, 768);
    descView.setMinimumSize(minimumSize);
    treeView.setMinimumSize(minimumSize);
    splitPane.setDividerLocation(768/2); 
    splitPane.setPreferredSize(new Dimension(1024, 768));

    if (useSystemLookAndFeel) {
        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.err.println("Couldn't use system look and feel.");
        }
    }
    extPedigreeJDialog.add(splitPane);
    extPedigreeJDialog.setSize(1024, 768);
    extPedigreeJDialog.setLocationRelativeTo(null);
    extPedigreeJDialog.setModal(true);
    extPedigreeJDialog.setVisible(true);
}
这里我添加到树上

private void createNodes(DefaultMutableTreeNode top, String a) {
    DefaultMutableTreeNode nodo = null; 
    ArrayList<DefaultMutableTreeNode> toReadList = new ArrayList<DefaultMutableTreeNode>();
    toReadList.add(new DefaultMutableTreeNode(a));
    Boolean flag = true;
    int j=0;
    while(flag){
        flag=false;
        for(int k=0;k<(Math.pow(2, (j)));k++){
            String b=toReadList.get(0).toString().substring(4);
            System.out.println("j="+j+" k=" + k + " " + " b="+b);
            //DefaultMutableTreeNode toTree = new DefaultMutableTreeNode();
            for(int i=0;i<2;i++){ // leggo genitori soggetto
                String toWrite = new String();
                nodo=toReadList.get(0);
                if((i&1)==0){
                    if (getPadre(b)!=null){
                        flag=true;
                        toWrite="1.0-" + getPadre(b);
                    }
                    else{
                        toWrite="1.0-";                        }
                }
                else{
                    if (getMadre(b)!=null){
                        flag=true;
                        toWrite="0.1-" + getMadre(b);
                    }
                    else{
                        toWrite="0.1-";
                    }
                }                   
                DefaultMutableTreeNode toTree = new DefaultMutableTreeNode(toWrite);
                System.out.println("toTree=" + toTree);
                if(j==0){
                    top.add(toTree);
                    System.out.println("i="+i+"Add to top");
                }
                else{
                    System.out.println("Node="+nodo+"To add="+toTree);
                    nodo.add(toTree);
                }
                toReadList.add(new DefaultMutableTreeNode(toWrite));
            }
            toReadList.remove(0);
            System.out.println("206 flag=" + flag + " k=" + k + " toRead size=" + toReadList.size());
            for(int i=0;i<toReadList.size();i++)
                System.out.println(i + " " + toReadList.get(i));
        }
        j=j+1;
    }
}
这些方法仅用于运行此示例

private Object getPadre(String b) {
    toReturn++;
    if(toReturn<20)
        return("1.0-FOI-89LR-E-12-001");
    return(null);
}

private Object getMadre(String b) {
    toReturn++;
    if(toReturn<20)
        return("0.1-FOI-89LR-E-12-002");
    return(null);
}

}
私有对象getPadre(字符串b){
toReturn++;

如果(toReturn要创建具有多个级别的树,您需要将新的子节点添加到其他节点的子节点。您正在尝试使用toReturn列表进行此操作。但是,在将节点添加到该列表时,您实际上并没有获取添加到树中的节点,而是获取一个新创建的节点。您正在创建新的树(稍后将其丢弃)向其中添加所有新节点。因此,它们永远不会以top作为根出现在树中

替换

toReadList.add(new DefaultMutableTreeNode(toWrite));


解决了这个问题。

您是否阅读了Oracle教程“如何使用树”,代码示例显示了-如何插入NodeYes我读了,但在这个特殊情况下,我无法解决此问题。:-)这很好,我认为这是一件小事,但在你花时间在代码的同一部分之后,你总是读它写。谢谢。
toReadList.add(new DefaultMutableTreeNode(toWrite));
toReadList.add(toTree);