nul*_*ull 0 java swing tabs jtabbedpane
我有一个使用 JTabbedPane 来显示其内容的开源应用程序。看看这个截图:
主要内容有一个 JSplitPane,左侧是 TreeMenu 对象,右侧是 JTabbedPane 对象。
当我从左侧面板单击菜单时,它将使用 JTabbedPane.addTab() 方法在 JTabbedPane 中显示菜单内容:
tabbedPane.addTab(menu.getTitle(), menu.getAPanel());
Run Code Online (Sandbox Code Playgroud)
我需要知道如何执行此操作:当我单击已打开关联选项卡的菜单时,它不会添加新选项卡,而是应将焦点放在已打开的选项卡上。
例如,您可以在屏幕截图中看到,我已经打开了成本类型选项卡。现在,如果我再次单击“成本类型”菜单,它应该将焦点移至“成本类型”选项卡,而不是添加新的“成本类型”选项卡。
菜单本身有一个唯一的 id 字段 (menu.getId())。然而,每次我点击菜单时, menu.getAPanel() 总是返回一个新的 APanel 实例。这意味着如果我两次单击“成本类型”菜单,则第一次单击和第二次单击时从 menu.getAPanel() 返回的 APanel 将永远不会是同一个实例。
任何人都可以帮忙吗?
更新:
好吧,这个问题似乎让其他人感到困惑,老实说,我不是母语为英语的人,这就是为什么我很难解释我的问题,但无论如何我已经找到了解决方案(感谢 MadProgrammer),所以我我打算删除这个问题,因为我认为它不会再让其他人受益,但为了纪念 MadProgrammer,我将这个问题开放两天,让他有机会提交他的答案并获得他应得的声誉。
只是有点好奇:
这个案例与我之前的问题有关。在原始源代码中,当单击菜单时,它实际上显示了一个弹出窗口。我正在尝试将流程更改为:单击菜单时,弹出窗口被隐藏,弹出窗口的内容面板 (APanel) 被提取并传输到 JTabbedPane 作为选项卡的组件。
您的菜单已经包含您需要的所有信息。这是一个快速模拟:
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);
Run Code Online (Sandbox Code Playgroud)
编辑
这些陈述(在问题中):
它将使用 tabbedPane.addTab(menu.getTitle(), menu.getAPanel()) 在 JTabbedPane 中显示菜单内容;
并在评论中:
这就是为什么在我最初的问题中(在我多次编辑之前),我声明我不能直接使用 indexOfComponent
是相互矛盾的,如下断言:
int old = tabbedPane.getTabCount();
tabbedPane.addTab(somename, myTabContent)
assertEquals(old, tabbedPane.indexOfComponent(myTabContent));
Run Code Online (Sandbox Code Playgroud)
清理一个或另一个;-)