You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现JTabbedPane标签单行显示、无滚动条且填满父JFrame宽度?

实现JTabbedPane标签单行填满父窗体宽度且无滚动条

要实现所有标签在一行显示、无滚动箭头且填满父窗体宽度的效果,你需要调整标签布局逻辑,并在窗体尺寸变化时动态调整每个标签的宽度,具体修改如下:

关键调整点

  • 移除SCROLL_TAB_LAYOUT设置(该策略会在标签过多时显示滚动条)
  • 给JFrame添加尺寸监听器,在窗体大小变化时,计算每个标签的平均宽度并设置,确保所有标签填满容器宽度
  • 通过自定义标签组件的宽度,强制标签始终单行显示,不会自动换行

修改后的完整代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class TabbedPaneExample extends JFrame {
    public TabbedPaneExample() {
        super("My TabbedPane");
        setup();
    }

    private void setup() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add("The first tab", new JPanel());
        tabbedPane.add("The second tab", new JPanel());
        tabbedPane.add("The third tab", new JPanel());
        tabbedPane.add("The fourth tab", new JPanel());
        tabbedPane.add("The fifth tab", new JPanel());

        // 移除滚动布局策略,避免出现滚动条
        // tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

        Container pane = this.getContentPane();
        pane.setLayout(new BorderLayout());
        this.add(tabbedPane, BorderLayout.CENTER);

        // 监听窗体尺寸变化,动态调整标签宽度
        this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                int tabCount = tabbedPane.getTabCount();
                if (tabCount == 0) return;

                // 计算TabbedPane的可用宽度,减去边框间距
                int availableWidth = tabbedPane.getWidth() - tabbedPane.getInsets().left - tabbedPane.getInsets().right;
                // 平分宽度给每个标签
                int tabWidth = availableWidth / tabCount;

                // 给每个标签设置固定宽度
                for (int i = 0; i < tabCount; i++) {
                    tabbedPane.setTabComponentAt(i, createFixedWidthTab(tabbedPane.getTitleAt(i), tabWidth));
                }
            }
        });
    }

    // 创建指定宽度的居中标签组件
    private JComponent createFixedWidthTab(String title, int width) {
        JLabel label = new JLabel(title, SwingConstants.CENTER);
        label.setPreferredSize(new Dimension(width, label.getPreferredSize().height));
        return label;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TabbedPaneExample example = new TabbedPaneExample();
            example.setSize(800, 600); // 设置初始窗体大小
            example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            example.setVisible(true);
        });
    }
}

代码说明

  1. 移除滚动布局:去掉SCROLL_TAB_LAYOUT后,默认布局不会生成滚动条,我们通过自定义标签宽度确保标签不会换行
  2. 动态宽度计算:每次窗体大小改变时,重新计算每个标签的宽度,让所有标签平分TabbedPane的可用宽度,保证填满整个行
  3. 自定义标签组件:使用居中对齐的JLabel作为标签载体,设置固定宽度,确保标签均匀分布且填满行宽

修改后,无论窗体如何调整尺寸,所有标签都会保持单行显示,且填满父窗体的宽度,不会出现滚动箭头。

内容的提问来源于stack exchange,提问作者Hervé Girod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:35:07