簡體   English   中英

如何設置JTabbed窗格的寬度以適合選項卡

[英]How to set width of JTabbed pane to fit the tabs

我的JTabbedPane中有3個標簽,我希望它們彼此相鄰,如下所示: 外觀如何,標簽彼此相鄰

但是,我沒有找到如何自動設置JTabbedPane的寬度,以使這些選項卡彼此相鄰的方法,因此我只是通過tabs.setPreferredSize(new Dimension(210, 300));設置寬度tabs.setPreferredSize(new Dimension(210, 300));

當然,這有很多問題,主要是它甚至不能在所有系統上運行: 兩行制表符不應該看起來

更不用說重命名或添加/刪除選項卡的問題。

因此,是否有一種很好的方法來計算選項卡名稱的寬度,然后傳遞給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]

小型可復制示例中的制表符

但是前兩個標簽返回-8。 只有第三個標簽的正確寬度為65。

對我來說似乎是個小蟲子。 在下面的代碼中,我通過兩次調用pack()解決了這個問題。

這是我的實現,它覆蓋了getPreferredSize()方法(具有上述技巧):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM