Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何扩展JTabbedPane以始终具有一个;添加选项卡";账单?_Java_Swing_Jtabbedpane - Fatal编程技术网

Java 如何扩展JTabbedPane以始终具有一个;添加选项卡";账单?

Java 如何扩展JTabbedPane以始终具有一个;添加选项卡";账单?,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我试图创建一个JTabbedPane,这样最终的“tab”实际上是一个按钮,它将打开一个对话框,向选项卡式窗格添加内容。我试着查找JTabbedPane的源代码,但找不到选项卡对象(单击时更改当前可见组件的可单击“按钮”行)的实际位置。页面对象有一个私有列表(因此子类无论如何都无法访问它们),但它们只包含关于选项卡的信息,而不是选项卡对象本身。我的目标是能够在选项卡列表之后添加一个按钮(水平) 我还尝试使用JTabbedPane.setTabComponentAt()将最后一个选项卡的字符串更改

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

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

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

谢谢

我的目标是能够在选项卡列表之后添加一个按钮(水平)

正确的解决方案是编写自定义UI,但这可能会很复杂,我不确定要更改什么代码

作为一个简单的技巧,您可以使用带有OverlyLayout的面板在选项卡式窗格的顶部/右侧显示按钮:

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();
            }
        });
    }
}

除非选项卡式窗格的宽度变得太小,并且按钮与选项卡重叠,否则效果非常好。

哦,很有趣。我认为java中的UI更适合于外观类型的东西,例如,当光标悬停时更改选项卡的颜色或选项卡的样式(如/--\vs |--|)。谢谢你的建议!我会给你的解决方案一个机会,尽管我很失望JTabbedPane似乎不可扩展:(哦,伙计,我真的能够从源代码中挖掘出来,看起来你确实是对的——JTabbedPane的所有视觉效果都来自它的UI字段(BasicTabbedPaneUI或例如WindowsTabbedPaneUI)它是从零开始构建的。没有按钮或面板。只需绘制矩形和处理鼠标事件。对于其他一切,我只是认为我遗漏了一些东西,因为我所有其他与swing相关的问题都得到了回答:“只需使用这个已经实现良好的组件并扩展它。”