我有一个使用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。
答案 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));
清理其中一个; - )