Java 发出JTabbedPane命令

Java 发出JTabbedPane命令,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,最近,我在索引选项卡时遇到了一些问题,尽管我会使用setComponentAt方法对其进行一些具体的排序。这是我的密码: public ContainerPane() { this.setLayout(new BorderLayout()); myPlayerManagerPane = new PlayerManagerPane(); myGameManagerPane = new GameManagerPane(); myCharacterManagerPane

最近,我在索引选项卡时遇到了一些问题,尽管我会使用
setComponentAt
方法对其进行一些具体的排序。这是我的密码:

public ContainerPane() {
    this.setLayout(new BorderLayout());
    myPlayerManagerPane = new PlayerManagerPane();
    myGameManagerPane = new GameManagerPane();
    myCharacterManagerPane = new CharacterManagerPane();

    myPaneTab = new JTabbedPane(JTabbedPane.TOP);
    myPaneTab.addTab("Character",myCharacterManagerPane);
    myPaneTab.addTab("Player",myPlayerManagerPane);
    myPaneTab.addTab("Games",myGameManagerPane);
    System.out.println(myPaneTab.getTabCount());
    //myPaneTab.setEnabledAt(1, false);
    //myPaneTab.setEnabledAt(2, false);
    myPaneTab.setComponentAt(0, myPlayerManagerPane);
    myPaneTab.setMnemonicAt(0, KeyEvent.VK_1);
    myPaneTab.setComponentAt(1, myCharacterManagerPane);
    myPaneTab.setMnemonicAt(1, KeyEvent.VK_2);
    myPaneTab.setComponentAt(2, myGameManagerPane);<---outOfBoundsException
    myPaneTab.setMnemonicAt(2, KeyEvent.VK_3);
    add(myPaneTab);
}
我在哪里绊倒了,有没有更简单的方法来订购窗格玻璃

编辑:注释掉
setComponent
方法,并放入for循环,我得到以下输出:

有3个标签
0处的制表符为字符
1处的选项卡是播放器
第二页是游戏

一次取消注释一对方法,我只得到两个,一个是我没有覆盖的,另一个是我现在设置的


setComponentAt
是否正在删除重复项?我的设置是否应该少于3个选项卡?JTabbedPanel对于重复窗格是否有奇怪的行为?

如果您希望选项卡按其他顺序添加,请按其他顺序添加它们:

myPaneTab = new JTabbedPane(JTabbedPane.TOP);
myPaneTab.addTab("Player",myPlayerManagerPane);
myPaneTab.addTab("Character",myCharacterManagerPane);
myPaneTab.addTab("Games",myGameManagerPane);

Et voilá。

我不确定setComponentAt是如何或为什么不工作的,尽管可能是制表符使用向量这一事实,我听说它们不好

如果希望有固定的添加顺序,只需使用
insertTab
如下所示:

myPaneTab.insertTab("Games",null, myGameManagerPane,"CharacterManagerPane",2);
其中null表示图标,不接受它作为空参数

这样,您就可以在源代码中知道选项卡的索引。唯一的问题是,您不能在超过当前tabCount的索引处添加新选项卡(您可以通过
getTabCount
找到),也就是说,您不能使用选项卡计算1,3,4


我相信您可以编写一个新的JTabb类,并重载
insertTab
方法来做一些更有帮助的事情,但它可能会混淆选项卡的位置(也就是说,你可以告诉它把标签放在索引2,它进入索引1。

查看
setComponentAt的源代码,你可以看到你正在设置的组件被删除了:

                int count = getComponentCount();
                Component children[] = getComponents();
                for (int i = 0; i < count; i++) {
                    if (children[i] == page.component) {
                        super.remove(i);
                    }
                }

因此,设置现有选项卡组件的顺序时,最终会出现两个选项卡。

由于尝试进行的更改,您会遇到一个错误-通过将一些窗格放到另一个位置,您会自动删除另一个选项卡。这就是为什么会出现错误-在某些更改后,选项卡少于3个(您可以检查每次“setComponentAt”操作后的输出选项卡数量)


只需删除所有要重新排序的选项卡,然后使用addTabinsertTab读取它们-这将使工作顺利完成。

这很好,但我遇到了一些问题,无法确定我的选项卡的选项卡索引是什么…这就是为什么我要给出索引。只有在添加选项卡时才能确定顺序,如上所述,在代码的其余部分,请向选项卡式窗格请求索引:
int indexOfGame=tabbedPane.indexOfTabComponent(myGameManagerPane);
。这将只允许在一个位置重新排列选项卡。代码的其余部分将保持不变。
                int count = getComponentCount();
                Component children[] = getComponents();
                for (int i = 0; i < count; i++) {
                    if (children[i] == page.component) {
                        super.remove(i);
                    }
                }
 page.component = component;