3

我最近遇到了索引标签的问题,尽管我会使用该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);
}

因此,对于我拥有的计数,3 个选项卡(根据我的说法和getTabCount()),我从 0 开始计数(正确吗?)。我将最后一个索引设置为我拥有的最后一个组件。但我仍然有这个印刷要筛选:

3 <---from tabCount
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

我在哪里绊倒了,有没有更简单的方法来订购我的窗格?

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

有3个标签!
0 的标签是角色
1 的标签是玩家
2 的标签是游戏

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

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

4

4 回答 4

3

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

简单地删除您想要重新排序的所有选项卡并使用addTabinsertTab 读取它们- 这将完成工作而不会出现任何错误。

于 2012-07-31T09:44:46.153 回答
2

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

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

接下来将此组件设置为页面的组件(覆盖该页面上的最后一个组件):

 page.component = component;

因此,设置现有选项卡组件的顺序最终会得到 2 个选项卡。

于 2012-07-31T09:44:09.640 回答
1

我不确定 setComponentAt 如何或为什么不起作用,尽管可能是选项卡使用 Vector 并且我听说它们很糟糕。

如果你想有一个固定的添加顺序,只需使用insertTabLike 这样:

myPaneTab.insertTab("Games",null, myGameManagerPane,"CharacterManagerPane",2);

其中 null 用于图标,并且不接受它作为空参数。

这样您就可以在源代码中知道选项卡的索引。唯一的问题是您无法在当前 tabCount 之后的索引处添加新选项卡(您可以通过 找到getTabCount),即您的选项卡无法计算 1、3、4!

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

于 2012-07-31T09:42:13.657 回答
0

如果您希望标签以其他顺序排列,请以其他顺序添加它们:

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

等等瞧。

于 2012-07-31T09:33:41.017 回答