如何将JTabbedPane扩展为始终具有“添加标签”选项卡?

时间:2014-04-27 22:27:41

标签: java swing jtabbedpane

我正在尝试创建一个JTabbedPane,以便最终的#34;标签"实际上是一个按钮,它将打开一个对话框以向选项卡式窗格添加内容。我试着查看JTabbedPane的源代码,但我找不到选项卡对象(可点击的行和#34;按钮"点击时更改当前可见的组件)的实际位置。有一个页面对象的私有列表(因此无论如何它们都不能被子类访问)但它们只包含有关选项卡的信息而不是选项卡对象本身。我的目标是能够添加一个位于选项卡列表之后的按钮(水平)。

我还尝试使用JTabbedPane.setTabComponentAt()将最终制表符的字符串更改为组件为null的JButton,但仍然添加了制表符组件。如果单击选项卡中按钮的右侧/左侧,将显示一个空白选项卡,因为它总是在组件周围填充。或许还有办法摆脱这种局面?但我想在一些外观和感觉中有这样的标签:/ --- \而不是这个:| --- |您仍然可以单击选项卡但不单击按钮。

有没有人知道如何在不编写我自己的JTabbedPane版本的情况下获得我想要的东西?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

我的目标是能够在标签列表之后(水平地)添加一个按钮。

正确的解决方案是编写自定义用户界面,但这可能很复杂,而且我不确定要更改的代码。

作为一个简单的黑客,您可以使用OverlayLayout来显示选项卡式窗格顶部/右侧的按钮:

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;

public class TabbedPaneWithComponent
{
    private static void createAndShowUI()
    {
        JPanel panel = new JPanel();
        panel.setLayout( new OverlayLayout(panel) );

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add("1", new JTextField("one"));
        tabbedPane.add("2", new JTextField("two"));
        tabbedPane.setAlignmentX(1.0f);
        tabbedPane.setAlignmentY(0.0f);

        JCheckBox checkBox = new JCheckBox("Check Me");
        checkBox.setOpaque( false );
        checkBox.setAlignmentX(1.0f);
        checkBox.setAlignmentY(0.0f);

        panel.add( checkBox );
        panel.add(tabbedPane);

        JFrame frame = new JFrame("TabbedPane With Component");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setLocationByPlatform( true );
        frame.setSize(400, 100);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

非常好用,除非选项卡式窗格的宽度变得太小而按钮与选项卡重叠。