Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTabbedPane问题:如何查找和跟踪现有JTabbedPane';s标签_Java_Swing_Tabs_Jtabbedpane - Fatal编程技术网

Java JTabbedPane问题:如何查找和跟踪现有JTabbedPane';s标签

Java JTabbedPane问题:如何查找和跟踪现有JTabbedPane';s标签,java,swing,tabs,jtabbedpane,Java,Swing,Tabs,Jtabbedpane,我有一个开源应用程序,它使用JTabbedPane来显示其内容。请看此屏幕截图: 主要内容有一个JSplitPane,左侧是TreeMenu对象,右侧是JTabbedPane对象 当我从左面板单击菜单时,它将使用JTabbedPane.addTab()方法在JTabbedPane中显示菜单内容: 我需要知道如何做到这一点:当我点击一个已经打开了相关选项卡的菜单时,它不会添加新选项卡,而是应该将焦点放在已经打开的选项卡上 例如,您可以在屏幕截图中看到,我已经打开了成本类型选项卡。现在,如果我再

我有一个开源应用程序,它使用JTabbedPane来显示其内容。请看此屏幕截图:

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

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

我需要知道如何做到这一点:当我点击一个已经打开了相关选项卡的菜单时,它不会添加新选项卡,而是应该将焦点放在已经打开的选项卡上

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

菜单本身有一个唯一的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);

清理其中一个;-)

您的菜单已经包含了所需的所有信息。下面是一个快速模拟:

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

清理其中一个;-)

“两个或两个以上的标签可以有相同的标题/图标”听起来让用户非常困惑。我的建议是,改变这一点,或者用一种有意义的方式来解释这个非同寻常的演示。你可以维护一个活动地图,将每个菜单项的某种唯一键映射到它的活动选项卡。如果键不存在,则该选项卡不存在。@安德鲁:是“/”吗?在我的国家,“/”可以表示“或”。不管怎样,我已经修好了,不知道它是否仍然让你或其他人感到困惑。@MadProgrammer:嗨,我们又见面了:)。那么这是最好的解决方案吗?是否有其他不依赖于其他对象的替代解决方案?您需要某种机制,将每个选项卡不平衡地标识回创建它的菜单项。考虑到你说你可以依靠标题或图标,你需要一些其他的键,菜单项似乎是合乎逻辑的选择。这是最好的吗?不能说,这是我当时能想到的“两个或更多的标签可以有相同的标题/图标”听起来让用户非常困惑。我的建议是,改变这一点,或者用一种有意义的方式来解释这个非同寻常的演示。你可以维护一个活动地图,将每个菜单项的某种唯一键映射到它的活动选项卡。如果键不存在,则该选项卡不存在。@安德鲁:是“/”吗?在我的国家,“/”可以表示“或”。不管怎样,我已经修好了,不知道它是否仍然让你或其他人感到困惑。@MadProgrammer:嗨,我们又见面了:)。那么这是最好的解决方案吗?是否有其他不依赖于其他对象的替代解决方案?您需要某种机制,将每个选项卡不平衡地标识回创建它的菜单项。考虑到你说你可以依靠标题或图标,你需要一些其他的键,菜单项似乎是合乎逻辑的选择。这是最好的吗?不能说,这是我当时能想到的。谢谢你的贡献。事实上,这是正确的,但也不完全正确,因为问题有点复杂(如果你读了我前面的第二个问题,你可能会理解。这是我工作进度的继续^^)。这就是为什么在我最初的问题中(在我编辑很多次之前),我说我不能直接使用indexOfComponent。简言之,每次我单击菜单时,即使菜单已经被单击过一次,getMenuPanel()返回的面板也始终不是同一个实例。然后在所有选项卡中循环,检查面板是否为子面板:如果已经添加,则必须在某个位置;-)更正:“这就是为什么在我最初的问题中(在我编辑很多次之前),我声明我不能使用APanel作为键,因此我不能直接使用indexOfComponent来查找并关注现有选项卡”。好吧,如果你仍然有兴趣解决这个问题,我可以给你看完整的代码,或者我可以给你看地图解决方案(对于后者,我更喜欢让MadProgrammer先做,因为这个想法是他提出的)。谢谢你的贡献。事实上,这是正确的,但也不完全正确,因为问题有点复杂(如果你读了我前面的第二个问题,你可能会理解。这是我工作进度的继续^^)。这就是为什么在我最初的问题中(在我编辑很多次之前),我说我不能直接使用indexOfComponent。简言之,每次我单击菜单时,即使菜单已经被单击过一次,getMenuPanel()返回的面板也始终不是同一个实例。然后在所有选项卡中循环,检查面板是否为子面板:如果已经添加,则必须在某个位置;-)更正:“这就是为什么在我最初的问题中(在我多次编辑之前),我说我不能使用APanel作为键,因此我不能直接使用indexOfComponent来查找和导入
int old = tabbedPane.getTabCount(); 
tabbedPane.addTab(somename, myTabContent)
assertEquals(old, tabbedPane.indexOfComponent(myTabContent));