如何使用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
相关产品推荐
相关产品推荐

