0

JTabbedPane を使用してコンテンツを表示するオープン ソース アプリケーションがあります。このスクリーンショットを見てください:

http://i46.tinypic.com/4rrs6c.jpg

メイン コンテンツには JSplitPane があり、左側が TreeMenu オブジェクトで、右側が JTabbedPane オブジェクトです。

左パネルからメニューをクリックすると、JTabbedPane.addTab() メソッドを使用して JTabbedPane にメニューの内容が表示されます。

tabbedPane.addTab(menu.getTitle(), menu.getAPanel());

これを行う方法を知る必要があります。関連するタブが既に開いているメニューをクリックすると、新しいタブは追加されず、既に開いているタブにフォーカスが移ります。

たとえば、スクリーンショットでわかるように、私はすでに[コストの種類] タブを開いています。ここで、[ Cost Type ] メニューをもう一度クリックすると、新しい [ Cost Type ] タブが追加されるのではなく、[ Cost Type ] タブにフォーカスが移動するはずです。

メニュー自体には一意の id フィールド (menu.getId()) があります。ただし、メニューをクリックするたびに、menu.getAPanel() は常に APanel の新しいインスタンスを返しました。つまり、Cost Typeメニューを 2 回クリックした場合、最初のクリックと 2 回目のクリックで menu.getAPanel() から返された APanel が同じインスタンスになることはありません。

誰でも助けることができますか?

更新:
わかりました、この質問は他の人を混乱させているようです。正直なところ、私は英語のネイティブスピーカーではありません。そのため、問題を説明するのに苦労しましたが、とにかく解決策を見つけました(MadProgrammerに感謝します)ので、私はこの質問は他の人の利益にはならないと思うので削除する予定ですが、MadProgrammer に敬意を表して、この質問を 2 日間開いたままにし、彼に回答を提出して彼にふさわしい評判を得る機会を与えます。

少し興味のある方のみ:
このケースは私の以前の質問と関係があります。元のソース コードでは、メニューをクリックすると、実際にポップアップ ウィンドウが表示されます。フローを次のように変更しようとしています。メニューをクリックすると、ポップアップ ウィンドウが非表示になり、ポップアップ ウィンドウのコンテンツ パネル (APanel) が取得され、タブのコンポーネントとして JTabbedPane に転送されます。

4

1 に答える 1

5

メニューには、必要な情報がすべて含まれています。簡単なモックを次に示します。

final JTabbedPane tabbedPane = new JTabbedPane();
final JComboBox items = new JComboBox(new Object[] {
        new MyMenu("one"), new MyMenu("other"), new MyMenu("got it?")
});
Action action = new AbstractAction("showInTab") {

    @Override
    public void actionPerformed(ActionEvent e) {
        MyMenu selected = (MyMenu) items.getSelectedItem();
        int index = tabbedPane.indexOfComponent(selected.getMenuPanel());
        if (index < 0) {
            tabbedPane.addTab(selected.getName(), selected.getMenuPanel());
        } else {
            tabbedPane.setSelectedIndex(index);
        }
    }
};
items.setSelectedIndex(-1);
items.setAction(action);

編集

これらのステートメント(質問内):

tabbedPane.addTab(menu.getTitle(), menu.getAPanel()); を使用して JTabbedPane にメニュー コンテンツを表示します。

とコメントで:

そのため、私の最初の質問 (何度も編集する前) で、indexOfComponent を直接使用できないと述べました。

次の主張が成り立つように、互いに矛盾しています。

int old = tabbedPane.getTabCount(); 
tabbedPane.addTab(somename, myTabContent)
assertEquals(old, tabbedPane.indexOfComponent(myTabContent));

どちらか一方をクリーンアップします;-)

于 2012-10-18T12:45:10.793 に答える