当使用 insertTab() 插入选项卡时,JTabbedPane.getComponentAt() 似乎 return 错误的组件
JTabbedPane.getComponentAt() seems to return wrong component when tab is inserted using insertTab()
当我尝试在其他选项卡之间插入一个选项卡时,JTabbedPane
遇到了一个奇怪的问题。 UI 按预期呈现,但 getComponentAt()
returns 是错误的组件。
在我的应用程序中,用户应该可以按照他想要的任何顺序重新排列选项卡。为此,我使用 insertTab()
方法插入制表符。执行此操作时,选项卡消失,其余选项卡内容错误。
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
public class InsertTabExample extends JFrame {
public InsertTabExample() {
final JTabbedPane pane = new JTabbedPane();
addTabsInReverseOrder(pane);
dumpTabs(pane);
add(pane);
this.setSize(640, 480);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private void addTabsInReverseOrder(final JTabbedPane pane) {
for(int i = 0; i < 10; i++) {
final String tabLabel = String.format("tab #%d", i);
final String componentLabel = String.format("component #%d", i);
final JLabel component = new JLabel(componentLabel);
component.setName(componentLabel);
pane.insertTab(tabLabel, null, component, null, 0);
}
}
private void dumpTabs(final JTabbedPane pane) {
for(int i = 0; i < pane.getTabCount(); i++) {
final String tabName = pane.getTitleAt(i);
final Component component = pane.getComponent(i);
final int componentIndex = pane.indexOfComponent(component);
System.out.println(String.format("Index %d -> tab '%s' -> component '%s' -> component index %d", i, tabName, component.getName(), componentIndex));
}
}
public static void main(String[] args) {
new InsertTabExample();
}
}
正如预期的那样,UI 以相反的顺序显示选项卡(从 "tab #9" 开始)并且它还显示每个选项卡的正确组件。
控制台上的输出显示了一些不同的东西。我希望得到
索引 0 -> 选项卡 'tab #9' -> 组件 'component #9' -> 组件索引 9
索引 1 -> 选项卡 'tab #8' -> 组件 'component #8' -> 组件索引 8
索引 2 -> 选项卡 'tab #7' -> 组件 'component #7' -> 组件索引 7
索引 3 -> 选项卡 'tab #6' -> 组件 'component #6' -> 组件索引 6
索引 4 -> 选项卡 'tab #5' -> 组件 'component #5' -> 组件索引 5
索引 5 -> 选项卡 'tab #4' -> 组件 'component #4' -> 组件索引 4
索引 6 -> 选项卡 'tab #3' -> 组件 'component #3' -> 组件索引 3
索引 7 -> 选项卡 'tab #2' -> 组件 'component #2' -> 组件索引 2
索引 8 -> 选项卡 'tab #1' -> 组件 'component #1' -> 组件索引 1
索引 9 -> 选项卡 'tab #0' -> 组件 'component #0' -> 组件索引 0
但我得到的是
索引 0 -> 选项卡 'tab #9' -> 组件 'component #0' -> 组件索引 9
索引 1 -> 选项卡 'tab #8' -> 组件 'component #1' -> 组件索引 8
索引 2 -> 选项卡 'tab #7' -> 组件 'component #2' -> 组件索引 7
索引 3 -> 选项卡 'tab #6' -> 组件 'component #3' -> 组件索引 6
索引 4 -> 选项卡 'tab #5' -> 组件 'component #4' -> 组件索引 5
索引 5 -> 选项卡 'tab #4' -> 组件 'component #5' -> 组件索引 4
索引 6 -> 选项卡 'tab #3' -> 组件 'component #6' -> 组件索引 3
索引 7 -> 选项卡 'tab #2' -> 组件 'component #7' -> 组件索引 2
索引 8 -> 选项卡 'tab #1' -> 组件 'component #8' -> 组件索引 1
索引 9 -> 选项卡 'tab #0' -> 组件 'component #9' -> 组件索引 0
选项卡标签按预期顺序返回,但组件按相反顺序列出。
这里出了什么问题?如何正确获取特定选项卡的组件?
感谢任何提示!
TabbedPane
保持索引从 0
到 getTabCount()
的顺序 - 所以最后一个标签不能是 0
- 所以当你添加标签时放置正确的索引:getTabCount()-i
private void addTabsInReverseOrder(final JTabbedPane pane) {
for(int i = 0; i < 10; i++) {
final String tabLabel = String.format("tab #%d", i);
final String componentLabel = String.format("component #%d", i);
final JLabel component = new JLabel(componentLabel);
component.setName(componentLabel);
pane.insertTab(tabLabel, null, component, null, pane.getTabCount()-i);
}
}
private void dumpTabs(final JTabbedPane pane) {
for(int i = 0; i < pane.getTabCount(); i++) {
final String tabName = pane.getTitleAt(i);
final Component component = pane.getComponentAt(i);
final int componentIndex = pane.indexOfComponent(component);
System.out.println(String.format("Index %d -> tab '%s' -> component '%s' -> component index %d", i, tabName, component.getName(), componentIndex));
}
}
另一个错误 - pane.getComponent(i)
获取了此容器中的第 n 个组件。
并且您需要将 pane.getComponentAt(i)
替换为 returns 特定索引处的组件。
输出将是:
Index 0 -> tab 'tab #9' -> component 'component #9' -> component index 0
Index 1 -> tab 'tab #8' -> component 'component #8' -> component index 1
Index 2 -> tab 'tab #7' -> component 'component #7' -> component index 2
Index 3 -> tab 'tab #6' -> component 'component #6' -> component index 3
Index 4 -> tab 'tab #5' -> component 'component #5' -> component index 4
Index 5 -> tab 'tab #4' -> component 'component #4' -> component index 5
Index 6 -> tab 'tab #3' -> component 'component #3' -> component index 6
Index 7 -> tab 'tab #2' -> component 'component #2' -> component index 7
Index 8 -> tab 'tab #1' -> component 'component #1' -> component index 8
Index 9 -> tab 'tab #0' -> component 'component #0' -> component index 9
因此选项卡和组件的索引 不会 倒序 - 它从 0 开始到 getTabsCount()
。
当我尝试在其他选项卡之间插入一个选项卡时,JTabbedPane
遇到了一个奇怪的问题。 UI 按预期呈现,但 getComponentAt()
returns 是错误的组件。
在我的应用程序中,用户应该可以按照他想要的任何顺序重新排列选项卡。为此,我使用 insertTab()
方法插入制表符。执行此操作时,选项卡消失,其余选项卡内容错误。
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
public class InsertTabExample extends JFrame {
public InsertTabExample() {
final JTabbedPane pane = new JTabbedPane();
addTabsInReverseOrder(pane);
dumpTabs(pane);
add(pane);
this.setSize(640, 480);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private void addTabsInReverseOrder(final JTabbedPane pane) {
for(int i = 0; i < 10; i++) {
final String tabLabel = String.format("tab #%d", i);
final String componentLabel = String.format("component #%d", i);
final JLabel component = new JLabel(componentLabel);
component.setName(componentLabel);
pane.insertTab(tabLabel, null, component, null, 0);
}
}
private void dumpTabs(final JTabbedPane pane) {
for(int i = 0; i < pane.getTabCount(); i++) {
final String tabName = pane.getTitleAt(i);
final Component component = pane.getComponent(i);
final int componentIndex = pane.indexOfComponent(component);
System.out.println(String.format("Index %d -> tab '%s' -> component '%s' -> component index %d", i, tabName, component.getName(), componentIndex));
}
}
public static void main(String[] args) {
new InsertTabExample();
}
}
正如预期的那样,UI 以相反的顺序显示选项卡(从 "tab #9" 开始)并且它还显示每个选项卡的正确组件。
控制台上的输出显示了一些不同的东西。我希望得到
索引 0 -> 选项卡 'tab #9' -> 组件 'component #9' -> 组件索引 9 索引 1 -> 选项卡 'tab #8' -> 组件 'component #8' -> 组件索引 8 索引 2 -> 选项卡 'tab #7' -> 组件 'component #7' -> 组件索引 7 索引 3 -> 选项卡 'tab #6' -> 组件 'component #6' -> 组件索引 6 索引 4 -> 选项卡 'tab #5' -> 组件 'component #5' -> 组件索引 5 索引 5 -> 选项卡 'tab #4' -> 组件 'component #4' -> 组件索引 4 索引 6 -> 选项卡 'tab #3' -> 组件 'component #3' -> 组件索引 3 索引 7 -> 选项卡 'tab #2' -> 组件 'component #2' -> 组件索引 2 索引 8 -> 选项卡 'tab #1' -> 组件 'component #1' -> 组件索引 1 索引 9 -> 选项卡 'tab #0' -> 组件 'component #0' -> 组件索引 0
但我得到的是
索引 0 -> 选项卡 'tab #9' -> 组件 'component #0' -> 组件索引 9 索引 1 -> 选项卡 'tab #8' -> 组件 'component #1' -> 组件索引 8 索引 2 -> 选项卡 'tab #7' -> 组件 'component #2' -> 组件索引 7 索引 3 -> 选项卡 'tab #6' -> 组件 'component #3' -> 组件索引 6 索引 4 -> 选项卡 'tab #5' -> 组件 'component #4' -> 组件索引 5 索引 5 -> 选项卡 'tab #4' -> 组件 'component #5' -> 组件索引 4 索引 6 -> 选项卡 'tab #3' -> 组件 'component #6' -> 组件索引 3 索引 7 -> 选项卡 'tab #2' -> 组件 'component #7' -> 组件索引 2 索引 8 -> 选项卡 'tab #1' -> 组件 'component #8' -> 组件索引 1 索引 9 -> 选项卡 'tab #0' -> 组件 'component #9' -> 组件索引 0
选项卡标签按预期顺序返回,但组件按相反顺序列出。
这里出了什么问题?如何正确获取特定选项卡的组件?
感谢任何提示!
TabbedPane
保持索引从 0
到 getTabCount()
的顺序 - 所以最后一个标签不能是 0
- 所以当你添加标签时放置正确的索引:getTabCount()-i
private void addTabsInReverseOrder(final JTabbedPane pane) {
for(int i = 0; i < 10; i++) {
final String tabLabel = String.format("tab #%d", i);
final String componentLabel = String.format("component #%d", i);
final JLabel component = new JLabel(componentLabel);
component.setName(componentLabel);
pane.insertTab(tabLabel, null, component, null, pane.getTabCount()-i);
}
}
private void dumpTabs(final JTabbedPane pane) {
for(int i = 0; i < pane.getTabCount(); i++) {
final String tabName = pane.getTitleAt(i);
final Component component = pane.getComponentAt(i);
final int componentIndex = pane.indexOfComponent(component);
System.out.println(String.format("Index %d -> tab '%s' -> component '%s' -> component index %d", i, tabName, component.getName(), componentIndex));
}
}
另一个错误 - pane.getComponent(i)
获取了此容器中的第 n 个组件。
并且您需要将 pane.getComponentAt(i)
替换为 returns 特定索引处的组件。
输出将是:
Index 0 -> tab 'tab #9' -> component 'component #9' -> component index 0
Index 1 -> tab 'tab #8' -> component 'component #8' -> component index 1
Index 2 -> tab 'tab #7' -> component 'component #7' -> component index 2
Index 3 -> tab 'tab #6' -> component 'component #6' -> component index 3
Index 4 -> tab 'tab #5' -> component 'component #5' -> component index 4
Index 5 -> tab 'tab #4' -> component 'component #4' -> component index 5
Index 6 -> tab 'tab #3' -> component 'component #3' -> component index 6
Index 7 -> tab 'tab #2' -> component 'component #2' -> component index 7
Index 8 -> tab 'tab #1' -> component 'component #1' -> component index 8
Index 9 -> tab 'tab #0' -> component 'component #0' -> component index 9
因此选项卡和组件的索引 不会 倒序 - 它从 0 开始到 getTabsCount()
。