JTabbedPane问题:如何查找和跟踪现有的JTabbedPane选项卡

时间:2012-10-18 08:14:02

标签: java swing tabs jtabbedpane

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

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

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

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

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

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

例如,您可以在屏幕截图中看到,我已经打开了费用类型标签。现在,如果我再次点击费用类型菜单,则应将重点放在费用类型标签上,而不是添加新的费用类型标签。

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

任何人都可以提供帮助吗?

更新
好吧,似乎这个问题令其他人感到困惑,说实话,我不是母语为英语的人,这就是为什么我很难解释我的问题而且我找到了解决办法(感谢MadProgrammer),所以我是计划删除这个问题因为我认为它不会再使其他人受益,但是为了纪念MadProgrammer,我会将这个问题保持开放两天,让他有机会提交他的答案并获得他应有的声誉。

只是为了一点点好奇:
此案例与my previous question有关。在原始源代码中,单击菜单时,它实际上显示一个弹出窗口。我正在尝试将流程更改为:单击菜单时,弹出窗口被隐藏,弹出窗口的内容面板(APanel)被取出并作为选项卡的组件传输到JTabbedPane。

1 个答案:

答案 0 :(得分:4)

您的菜单已包含您需要的所有信息。这是一个快速模拟:

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

清理其中一个; - )