使用HashMap创建JTree

时间:2013-07-12 16:04:39

标签: java swing hashmap jtree

我正在尝试创建一个在我的应用程序中显示的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);

Bellow是addNode方法:

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

在这里,我尝试添加一个Creature节点,该节点是特定Party节点的子节点:

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 index表示的节点,然后我可以将该节点添加到树中,并显示正确的文本和parent。正如你所看到的那样,我尝试多次这样做,但似乎没有什么可以坚持下去。

1 个答案:

答案 0 :(得分:2)

想到这一切都错了!

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

在“Cave”对象中,我创建了Node的根。 (洞穴首先构建,并在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

然后在创建“Object”时我构造它并将父节点设置为根节点“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"
}

获得的经验教训: 当它归结为每个节点放置在我的对象层次结构中的是它自己的对象的属性,并且应该在每个相应的类中描述/建立。