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

ここでは、特定の Party ノードの子である 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 を作成する必要があります。

この「Cave」オブジェクトで、ノードのルートを作成します。(洞窟が最初に構築され、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 に答える