gpt4 book ai didi

java - 在 JTabbedPane 中设置自定义 header 组件(TabComponent)的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:57 25 4
gpt4 key购买 nike

概述:

我必须开发一个 JTabbedPane,它应该有一个默认选项卡,仅在没有显示其他选项卡时才显示(我使用 ContainerListener 实现)。

此外,它应该为每个添加的选项卡创建一个自定义 header (我实现了覆盖 addTab)。

关注 MCVE可以按原样使用:

public class MyCustomTabbedPane extends JTabbedPane {

private final JPanel defaultTab = new JPanel();

public MyCustomTabbedPane() {
super();

JButton exampleButton = new JButton("Click me");
exampleButton.addActionListener((e) -> addTab("New page", null, new JPanel()));
defaultTab.add(exampleButton);

addTab("Default", null, defaultTab);
addContainerListener(new ContainerListener() {

@Override
public void componentRemoved(ContainerEvent e) {
if (getTabCount() == 0) {
addTab("Default", null, defaultTab);
}
}

@Override
public void componentAdded(ContainerEvent e) {
if (getTabCount() > 1) {
remove(defaultTab);
}
}
});
}

@Override
public void addTab(String title, Icon icon, Component component) {
int index = getTabCount();
// Add new tab at the back with default header
super.addTab(title, icon, component);
// Create custom header based on default header
Component header = createHeader(title, icon, getTabComponentAt(index));
// Set custom header for added tab
setTabComponentAt(index, header);
// Select the added tab
setSelectedIndex(index);
}

private Component createHeader(String title, Icon icon, Component header) {
if(header == null) {
header = new JLabel(title, icon, SwingConstants.LEFT);
}
JPanel panel = new JPanel();
panel.add(new JLabel("Just an example header modification - "));
panel.add(header);
return panel;
}
}

问题:

问题发生在 addTab 重写中的 super.addTab(title, icon, component); 处,因为此时它会触发 componentAdded 事件。由于此事件,默认页面将被删除(因此选项卡的数量会发生变化)。因此,addTab 中的 index 值不再正确,并导致 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

问题:

我可以告诉 JTabbedPane 延迟 super.addTab(title, icon, component)setTabComponentAt(index, header) 之间的事件吗?如果这是不可能的,是否有另一种方法可以添加带有自定义标题的新选项卡,而不首先添加带有默认标题的选项卡?

最佳答案

嗯,我想最简单的方法是在 super.addTab() 之后添加一行一行做
index = index == getTabCount() ? 0 : index
index = index == getTabCount() ? index - 1 : index
if (index == getTabCount()) { index-- }

关于java - 在 JTabbedPane 中设置自定义 header 组件(TabComponent)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com