Java 如何设置JTabed窗格的宽度以适应选项卡

Java 如何设置JTabed窗格的宽度以适应选项卡,java,swing,layout,tabs,jtabbedpane,Java,Swing,Layout,Tabs,Jtabbedpane,我的JTabbedPane中有3个选项卡,我希望它们彼此相邻,如下所示: 但是,我没有找到如何自动设置JTabbedPane的宽度,以便选项卡彼此相邻,所以我只是通过tabs.setPreferredSize(新维度(210300))设置宽度 这当然有很多问题,主要是它甚至不适用于所有系统: 更不用说重命名或添加/删除选项卡的问题了 那么,有没有一种计算选项卡名称宽度的好方法,然后传递到setPreferedSize()方法,或者更好的方法,一些setWidthToFitTabs()方法 编

我的JTabbedPane中有3个选项卡,我希望它们彼此相邻,如下所示:

但是,我没有找到如何自动设置JTabbedPane的宽度,以便选项卡彼此相邻,所以我只是通过
tabs.setPreferredSize(新维度(210300))设置宽度

这当然有很多问题,主要是它甚至不适用于所有系统:

更不用说重命名或添加/删除选项卡的问题了

那么,有没有一种计算选项卡名称宽度的好方法,然后传递到
setPreferedSize()
方法,或者更好的方法,一些
setWidthToFitTabs()
方法

编辑:最小完整示例:

SwingUtilities.invokeLater(() -> {

    JFrame frame = new JFrame("Tabs text");
    JTabbedPane tabs = new JTabbedPane();

    tabs.addTab("Tab1", new JLabel("Content1"));
    tabs.addTab("Tab2", new JLabel("Content2"));
    tabs.addTab("Tab3", new JLabel("Content3"));
    tabs.addTab("Tab4", new JLabel("Content4"));

    for (int i = 0; i < tabs.getTabCount(); i++) {
        System.out.println(tabs.getUI().getTabBounds(tabs, i));
    }

    frame.add(tabs);

    frame.pack();
    frame.setVisible(true);

});

但对于前两个选项卡,它返回-8。只有第三个选项卡的正确宽度为65

对我来说似乎有点讨厌。在下面的代码中,我通过两次调用pack()来解决这个问题

下面是我覆盖getPreferredSize()方法的实现(使用上述hack):

import java.awt.*;
导入javax.swing.*;
公共班机
{
公共静态void main(字符串[]args)引发异常
{
SwingUtilities.invokeLater(()->
{
JFrame=新JFrame(“制表符文本”);
JTabbedPane tabs=新JTabbedPane()
{
@凌驾
公共维度getPreferredSize()
{
int tabsWidth=0;
for(int i=0;i
查看本主题是否有帮助:感谢链接,这是最坏情况下可行的解决方案。顺便说一句,我已经尝试了
pane.getUI().gettabounds(pane,I).width
,但是对于前两个选项卡,它返回
-8
。只有第三个标签的宽度正确,即
65
。请发布您的标签,说明您的问题。看,普遍的共识是肯定的。我认为这可能是一个布局问题(或者可能是一个空布局问题)哦,天哪,“不要使用
setPreferedSize
”帖子说你应该扩展
JComponent
并覆盖
getPreferedSize
方法来返回你想要的
维度的缓存副本,这正是默认的getPreffedSize所做的。我将添加一点示例。现在我考虑一下,我总是可以得到最后添加的选项卡的宽度,因为最后一个选项卡的宽度总是正确的。这不考虑填充(如果有的话)以及其他因素,并且与f*ck一样笨拙,但至少它可能会工作。谢谢,在调用
pack()
后宽度是正确的,所以调用第二个
pack()
将注册正确的尺寸。@kajacx,很高兴这个建议有帮助。不要忘记通过点击复选标记来“接受”答案,这样人们就知道问题已经解决了。啊,对不起,在我在实际应用程序中实现了这一点之后,忘记接受了。
java.awt.Rectangle[x=2,y=59,width=-8,height=19]
java.awt.Rectangle[x=2,y=40,width=-8,height=19]
java.awt.Rectangle[x=2,y=21,width=-8,height=19]
java.awt.Rectangle[x=2,y=2,width=49,height=19]
import java.awt.*;
import javax.swing.*;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        SwingUtilities.invokeLater(() ->
        {

            JFrame frame = new JFrame("Tabs text");
            JTabbedPane tabs = new JTabbedPane()
            {
                @Override
                public Dimension getPreferredSize()
                {
                    int tabsWidth = 0;

                    for (int i = 0; i < getTabCount(); i++) {
                        tabsWidth += getBoundsAt(i).width;
                    }

                    Dimension preferred = super.getPreferredSize();

                    preferred.width = Math.max(preferred.width, tabsWidth);

                    return preferred;
                }
            };

            tabs.addTab("Tab1", new JLabel("Content1"));
            tabs.addTab("Tab2", new JLabel("Content2"));
            tabs.addTab("Tab3", new JLabel("Content3"));
            tabs.addTab("Tab4", new JLabel("Content4"));


            frame.add(tabs);

            frame.pack();
            frame.pack();
            frame.setVisible(true);
        });
    }
}