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

如何使用javax.swing实现应用标题在标题栏居中显示

Swing实现窗口标题居中的解决方案

首先明确:可以实现该需求。你之前添加空格不生效的原因是,默认JFrame的标题栏由操作系统原生控件渲染,原生控件会自动修剪掉标题文本首尾的空白字符,所以添加的空格不会被显示。

实现方案

方案1:自定义标题栏(推荐,跨平台兼容性最好)

完全隐藏系统原生标题栏,自行绘制标题栏区域,可100%控制标题对齐样式,还可以自定义标题栏的外观、按钮样式等:

  • 核心逻辑:调用setUndecorated(true)关闭原生标题栏,在窗口顶部添加自定义的标题栏面板,自行实现标题居中、窗口控制按钮、拖拽移动/缩放等逻辑
  • 参考实现代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CenterTitleDemo extends JFrame {
    // 存储窗口拖拽时的坐标偏移
    private int dragOffsetX, dragOffsetY;

    public CenterTitleDemo() {
        // 隐藏原生标题栏
        setUndecorated(true);
        setSize(800, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 自定义标题栏
        JPanel titleBar = new JPanel(new BorderLayout());
        titleBar.setBackground(new Color(240, 240, 240));
        titleBar.setPreferredSize(new Dimension(getWidth(), 32));

        // 居中显示的标题
        JLabel titleLabel = new JLabel("居中显示的窗口标题", SwingConstants.CENTER);
        titleBar.add(titleLabel, BorderLayout.CENTER);

        // 关闭按钮示例
        JButton closeBtn = new JButton("×");
        closeBtn.setBorderPainted(false);
        closeBtn.setBackground(new Color(240,240,240));
        closeBtn.addActionListener(e -> dispose());
        titleBar.add(closeBtn, BorderLayout.EAST);

        // 实现窗口拖拽逻辑
        titleBar.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                dragOffsetX = e.getX();
                dragOffsetY = e.getY();
            }
        });
        titleBar.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                setLocation(getX() + e.getX() - dragOffsetX, getY() + e.getY() - dragOffsetY);
            }
        });

        add(titleBar, BorderLayout.NORTH);
        // 窗口内容区域
        add(new JPanel(), BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new CenterTitleDemo().setVisible(true));
    }
}

方案2:空格占位兼容方案(仅部分环境生效)

如果不想自定义标题栏,可以使用不被原生控件修剪的不间断空格\u00A0代替普通空格,计算好需要填充的数量后拼接到标题前后即可。但该方案仅在部分Windows系统的特定JDK版本下生效,跨平台兼容性差,不推荐生产环境使用。

注意事项

  • 自定义标题栏时如果需要保留原生窗口的边缘缩放、系统右键菜单等能力,需要额外添加对应逻辑的实现
  • 目前没有可以保留原生标题栏外观、同时跨平台实现标题居中的通用方案

内容的提问来源于stack exchange,提问作者Ruthvik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:15:02