0

我有一个使用 JTabbedPane 来显示其内容的开源应用程序。看这个截图:

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

主要内容有一个 JSplitPane,左侧是 TreeMenu 对象,右侧是 JTabbedPane 对象。

当我从左侧面板单击菜单时,它将使用 JTabbedPane.addTab() 方法在 JTabbedPane 中显示菜单内容:

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

我需要知道如何执行此操作:当我单击已打开关联选项卡的菜单时,它不会添加新选项卡,而是应该将焦点放在已打开的选项卡上。

例如,您可以在屏幕截图中看到,我已经打开了成本类型选项卡。现在,如果我再次单击“成本类型”菜单,它应该将焦点带到“成本类型”选项卡,而不是添加新的“成本类型”选项卡。

菜单本身有一个唯一的 id 字段 (menu.getId())。但是,每次我单击菜单时,menu.getAPanel() 总是返回一个新的 APanel 实例。这意味着如果我两次单击“成本类型”菜单,则第一次单击和第二次单击从 menu.getAPanel() 返回的 APanel 将永远不会是同一个实例。

任何人都可以帮忙吗?

更新:
好吧,似乎这个问题让其他人感到困惑,老实说,我不是以英语为母语的人,这就是为什么我很难解释我的问题并且我还是找到了解决方案(感谢 MadProgrammer),所以我'我打算删除这个问题,因为我认为它不会再使其他人受益,但为了向 MadProgrammer 致敬,我将把这个问题开放两天,让他有机会提交答案并获得他应得的声誉。

只是有点好奇:
这个案例与我之前的问题有关。在原始源代码中,当单击菜单时,它实际上会显示一个弹出窗口。我正在尝试将流程更改为:单击菜单时,弹出窗口被隐藏,并且弹出窗口的内容面板(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 回答