1

我正在尝试创建一个 JTree 以显示在我的应用程序中,它将显示我的应用程序的内部数据结构。我使用 HashTable 来初始化我的所有对象,这些对象利用您可以使用 getIndex() 检索的每个对象索引。我正在尝试仅使用要显示的每个对象的名称来创建 JTree

我无法弄清楚如何正确添加节点。我创建了一个新节点,但无法将其作为父节点引用。

在这里,我创建了我的 JTree 和根节点:

JTree                                           tree;
    DefaultMutableTreeNode                          treeRoot = new DefaultMutableTreeNode( "Cave" );
    tree                                            = new JTree( treeRoot );

在这里,我创建了一个节点,它代表一个 Party 对象,它是根节点的新子节点:

        //DefaultMutableTreeNode newParty.getIndex();  //!Does not work
        //DefaultMutableTreeNode newParty.getIndex() = new DefaultMutableTreeNode( newParty.getName() , treeRoot ); //does not work
        addNode( newParty.getName(), treeRoot);

下面是 addNode 方法:

static DefaultMutableTreeNode addNode ( String Asset, DefaultMutableTreeNode parent ){
    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( Asset );
    parent.add( newNode );
    return newNode;
}

在这里,我尝试添加一个作为特定派对节点子节点的 Creature 节点:

findParty =             ( newCreature.getParty() );// == index of parent Node in HashMap
                    if (findParty == 0 ) {
                        SorcerersCave.theCave.addCreature( newCreature );
                        addNode ( newCreature.getName(), treeRoot );
                    }else {
                        ((Party)gameAssets.get( findParty )).addMember( newCreature );
                        gameAssets.put(  newCreature .getIndex(), newCreature );
                        addNode ( newCreature.getName(), ((Party)gameAssets.get( findParty ).getName() ) );

理想情况下,我想创建由每个对象 int 索引表示的节点,然后我可以将该节点添加到树中,并显示正确的文本和父节点。如您所见,我尝试多次这样做,但似乎没有任何效果。

4

1 回答 1

2

都想错了!

而不是在实例化我的所有类的方法中创建 JTree 是错误的方法。您应该使用每个对象的内部方法和构造函数来创建 JTree。

在“洞穴”对象中,我创建了节点的根。(洞穴首先被建造,并将在 ArrayList 中包含 4 个“Party”对象)

class Cave {
    public ArrayList< Party >                   parties = new ArrayList < Party > ();
    ...
    public JTree                                theTree;
    public DefaultMutableTreeNode               treeRoot = new DefaultMutableTreeNode( "Cave" );
    ...

    public Cave (){//Constructs Cave Object
        theTree                                            = new JTree( treeRoot );
    }
}//End Cave

然后在创建“对象”时构造它并将父节点设置为根节点“treeRoot”:

class Party extends Assets implements SearchableByName {
    ArrayList < Creature >                  members = new ArrayList < Creature > ();
    DefaultMutableTreeNode                  pNode;
    public void addMember ( Creature newMember ) {
    members.add ( newMember );
        newMember.cNode = addNode( newMember.getName(), this.pNode );
        newMember.tNode = addNode( "Treasures", newMember.cNode );//Each Creature hold Treasures
        newMember.aNode = addNode( "Artifacts", newMember.cNode );//Each Creature holds Artifacts
    }
    public Party ( String[] x ){//Party Consstructor
        index =                             Integer.parseInt( x[ 0 ] );
        name =                              x[ 1 ];
        pNode =                             addNode( this.getName(), SorcerersCave.theCave.treeRoot );//Creates new Parent node with treeNode as its parent
    }
}//End Party

最后,当我将宝藏和文物添加到属于持有它们的生物的 ArrayLists 时,我将它们添加到它们各自的父节点。

public void addItem ( Treasure newItem ) {
    inventory.add ( newItem );
    addNode ( newItem.getType(), tNode );//Add Treasure parent Node labeled "Treasures"
}
public void addArtifact ( Artifact newItem ) {
    artifacts.add ( newItem );
    addNode ( newItem.getName(), aNode );//Add Artifact Node to parent Node labeled "Artifacts"
}

经验教训:归根结底,每个节点在我的对象层次结构中的位置是它自身的对象的属性,应该在每个相应的类中描述/建立。

于 2013-07-12T17:36:03.787 回答