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

时间:2017-03-01 13:23:28

标签: java swing layout tabs jtabbedpane

我的JTabbedPane中有3个标签,我希望它们彼此相邻,如下所示: How it should looked, tabs next to each other

但是,我还没有找到如何自动设置JTabbedPane的宽度,以便标签彼此相邻,所以我只需将宽度设置为tabs.setPreferredSize(new Dimension(210, 300));

这当然有很多问题,主要是它甚至不适用于所有系统: How it shouldn't look, tabs in 2 rows

更不用说重命名或添加/删除标签的问题了。

那么,是否有一种很好的方法来计算选项卡名称的宽度,然后传入setPrefferedSize()方法,或者更好的是,某些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);

});

结果:

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]

Tabs in the small, reproducable example

1 个答案:

答案 0 :(得分:3)

  

但前两个标签返回-8。只有第三个标签的正确宽度为65。

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

这是我的实现,它覆盖了getPreferredSize()方法(使用上面的hack):

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