java - 使用 HashMap 创建 JTree

标签 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);

下面是 addNode 方法:

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

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

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

最佳答案

原来自己的想法都是错误的!

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

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

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

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

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"
}

经验教训: 归根结底,对象层次结构中每个节点的位置都是对象本身的一个属性,并且应该在每个相应的类中进行描述/建立。

关于java - 使用 HashMap 创建 JTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619168/

相关文章:

java - 将 jar 文件 URI 转换为文件

java - Spring Boot - 返回带有对象数组的 JSON

java - CompareTo 返回值不正确

java - 如何在JAVA中使用线程频繁更新JTable?

java - 如何通过文本 Pane 隐藏 Swing 加速器?

performance - 如何让这段代码更高效?

java.lang.Boolean 无法转换为 java.util.LinkedList

java - Android IDE 不创建 Main.java 或 XML

Java:当从 JMenuItem 多次调用方法时,JTextField 会创建无限循环

Clojure简单马尔可夫数据变换