我最近遇到了索引我的标签的问题,尽管我使用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对重复窗格有奇怪的行为吗?
答案 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。