提供JTabbedPane订单

时间:2012-07-31 09:10:39

标签: java swing jtabbedpane

我最近遇到了索引我的标签的问题,尽管我使用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是游戏

一次解开一对方法,我只得到2,我没有覆盖的那个,以及我现在设置的那个。

setComponentAt删除重复项吗?我的设置应该少于3个标签吗? JTabbedPanel对重复窗格有奇怪的行为吗?

4 个答案:

答案 0 :(得分:3)

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

简单删除要重新排序的所有标签,并使用 addTab insertTab 读取它们 - 这样可以完成工作而不会出现任何错误。

答案 1 :(得分: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个标签。

答案 2 :(得分:0)

如果您希望自己的标签符合其他订单,请按其他顺序添加:

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

Etvoilà。

答案 3 :(得分:0)

我不确定setComponentAt是如何或为什么不起作用的,虽然可能是标签使用了Vector而我听说它们很糟糕。

如果您想要一个固定的添加顺序,只需使用insertTab就像这样:

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

null表示图标,并且不接受它作为空参数。

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

我确信你可以编写一个新的JTabb类,并重载insertTab方法来做一些更有帮助的方法,但它可能会混淆选项卡所在的位置(即这样你可以告诉它将标签放在索引处2,它进入索引1。