3

setComponentAt最近、タブのインデックス作成で問題が発生しましたが、メソッドを使用して具体的な順序付けを行います。これが私のコードです:

public ContainerPane() {
    this.setLayout(new BorderLayout());
    myPlayerManagerPane = new PlayerManagerPane();
    myGameManagerPane = new GameManagerPane();
    myCharacterManagerPane = new CharacterManagerPane();

    myPaneTab = new JTabbedPane(JTabbedPane.TOP);
    myPaneTab.addTab("Character",myCharacterManagerPane);
    myPaneTab.addTab("Player",myPlayerManagerPane);
    myPaneTab.addTab("Games",myGameManagerPane);
    System.out.println(myPaneTab.getTabCount());
    //myPaneTab.setEnabledAt(1, false);
    //myPaneTab.setEnabledAt(2, false);
    myPaneTab.setComponentAt(0, myPlayerManagerPane);
    myPaneTab.setMnemonicAt(0, KeyEvent.VK_1);
    myPaneTab.setComponentAt(1, myCharacterManagerPane);
    myPaneTab.setMnemonicAt(1, KeyEvent.VK_2);
    myPaneTab.setComponentAt(2, myGameManagerPane);<---outOfBoundsException
    myPaneTab.setMnemonicAt(2, KeyEvent.VK_3);
    add(myPaneTab);
}

したがって、私が持っているカウントについては、3 つのタブ (私によると、およびgetTabCount()) であり、0 からカウントしています (正しいですか?)。私は最後のインデックスを私が持っている最後のコンポーネントに設定しています。しかし、私はまだこの画面への印刷を持っています:

3 <---from tabCount
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

ペインを注文する簡単な方法はありますか?

編集:setComponentメソッドをコメントアウトし、for ループを挿入すると、次の出力が得られます。

タブは3つ!
0 のタブはキャラクターです
1 のタブはプレイヤー
です 2 のタブはゲームです

一度に 1 つのメソッドのペアのコメントを外すと、上書きしていないメソッドの 2 つと、現在設定したメソッドの 1 つのみが得られます。

setComponentAt重複を削除していますか?セットアップでタブを 3 つ未満にする必要はありますか? JTabbedPanel は、複製されたペインに対して奇妙な動作をしますか?

4

4 に答える 4

3

実行しようとしている変更が原因でエラーが発生します。一部のペインを別の位置に配置すると、別のタブが自動的に削除されます。そのため、エラーが発生します。一部の変更後のタブは3つ未満です(各「setComponentAt」操作の後に出力タブの量を確認できます)。

並べ替えるすべてのタブを削除し、addTabまたはinsertTabのいずれかを使用してそれらを読み取るだけです。これにより、エラーなしで作業が完了します。

于 2012-07-31T09:44:46.153 に答える
2

のソースコードを見ると、setComponentAt設定しているコンポーネントが削除されていることがわかります。

                int count = getComponentCount();
                Component children[] = getComponents();
                for (int i = 0; i < count; i++) {
                    if (children[i] == page.component) {
                        super.remove(i);
                    }
                }

次に、このコンポーネントはページのコンポーネントとして設定されます(そのページの最後に存在するコンポーネントをオーバーライドします)。

 page.component = component;

したがって、既存のタブコンポーネントの順序を設定すると、2つのタブになります。

于 2012-07-31T09:44:09.640 に答える
1

setComponentAtが機能しなかった方法や理由はわかりませんが、タブがVectorを使用している可能性があり、タブが悪いと聞いています。

追加の順序を固定したい場合は、次のinsertTabように使用します。

myPaneTab.insertTab("Games",null, myGameManagerPane,"CharacterManagerPane",2);

nullはアイコンを表し、空の引数として受け入れません。

このようにして、ソースコードでタブのインデックスを知ることができます。これに関する唯一の問題は、現在のtabCount(を介して見つけることができますgetTabCount)を超えるインデックスに新しいタブを追加できないことです。つまり、タブで1,3,4をカウントすることはできません。

新しいJTabbクラスを作成し、insertTabメソッドをオーバーロードしてより役立つことを実行できると確信していますが、タブがどこにあるかがわかりにくくなる可能性があります(つまり、この方法で、タブをインデックス2に配置し、インデックス1に入れることができます。

于 2012-07-31T09:42:13.657 に答える
0

タブを別の順序で追加する場合は、次の順序でタブを追加します。

myPaneTab = new JTabbedPane(JTabbedPane.TOP);
myPaneTab.addTab("Player",myPlayerManagerPane);
myPaneTab.addTab("Character",myCharacterManagerPane);
myPaneTab.addTab("Games",myGameManagerPane);

Etvoilà。

于 2012-07-31T09:33:41.017 に答える