【发布时间】:2014-08-24 20:53:04
【问题描述】:
我在创建一个空的 JTabbedPane 时遇到问题,其中 GUI 上唯一可见的部分是选项卡行。
每次我添加一个带有“空”组件的新选项卡时,JTabbedPane 的高度都会增加,但为什么呢?
当前的解决方法是覆盖getPreferredSize(),但对我来说似乎很笨拙。注释掉被覆盖的方法,看看我的意思。
我是否遗漏了一些明显的东西?
背景:
我们需要一个 JTabbedPane,其中选项卡式窗格从 2 个选项卡开始,但用户可以根据需要添加更多选项卡,最多 10 个。此外,每个选项卡包含相同的组件,但具有不同的数据。决定伪造 JTabbedPane 的外观,实现一个空的 JTabbedPane 仅用于外观,并使用单个固定的 JPanel,其内容将根据单击的选项卡刷新。
(通常,我可以重新创建 JPanel n 次,但这对于控制 UI 的演示者类来说将是一场噩梦,这超出了我的问题范围。)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CustomTabbedPane implements Runnable
{
static final int MAX_TABS = 11; // includes the "add" tab
JPanel pnlTabs;
JTabbedPane tabbedPane;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new CustomTabbedPane());
}
public void run()
{
JPanel p = buildPanel();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(p);
frame.setSize(800,400);
frame.setVisible(true);
}
private JPanel buildPanel()
{
tabbedPane = new JTabbedPane()
{
@Override
public Dimension getPreferredSize()
{
Dimension dim = super.getPreferredSize();
dim.height = getUI().getTabBounds(this, 0).height + 1;
return dim;
}
};
tabbedPane.addTab("Tab 1", getEmptyComp());
tabbedPane.addTab("Tab 2", getEmptyComp());
tabbedPane.addTab("+", new TabCreator());
tabbedPane.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
addTab();
}
});
JScrollPane scroll = new JScrollPane(new JTable(5,10));
JPanel p = new JPanel(new BorderLayout());
p.add(tabbedPane, BorderLayout.NORTH);
p.add(scroll, BorderLayout.CENTER);
p.setBorder(BorderFactory.createLineBorder(Color.BLUE.darker(), 1));
return p;
}
private void addTab()
{
if (tabbedPane.getSelectedComponent() instanceof TabCreator)
{
int selIndex = tabbedPane.getSelectedIndex();
if (tabbedPane.getComponentCount() < MAX_TABS)
{
if (selIndex == tabbedPane.getComponentCount()-1)
{
String title = "Tab " + (selIndex + 1);
tabbedPane.insertTab(title, null, getEmptyComp(), "", selIndex);
tabbedPane.setSelectedIndex(selIndex);
if (tabbedPane.getComponentCount() == MAX_TABS)
{
tabbedPane.setEnabledAt(MAX_TABS-1, false);
}
}
}
}
}
private Component getEmptyComp()
{
return Box.createVerticalStrut(1);
}
class TabCreator extends JLabel {}
}
【问题讨论】:
-
1. JTabbedPane 真的是被宠坏的 CardLayout,没有 suprices 然后用受保护的方法为 BasicsXxxUI(不包括 WindowsXxxL&F),2. 必须杀死BasicTabbedPaneUI (methods at bottom, in your case without super.xxxXxx???)
-
伙计,这个问题已经困扰我好几天了。你能找到一个体面的解决方案吗?
标签: java swing jtabbedpane