如何在Java Swing中实现将JMenuBar放置到标题栏中
核心说明
Swing默认无法直接向操作系统原生标题栏中添加组件,要实现VSCode这种菜单栏嵌入标题栏的效果,目前有两种成熟的实现路径:
方案1:完全自定义标题栏(兼容全Java版本,跨平台可用)
该方案灵活度最高,可完全自定义标题栏样式,适配任意设计需求:
- 首先关闭系统原生标题栏绘制,执行以下初始化代码:
// 初始化窗口前配置 JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("演示窗口"); // 关闭系统默认标题栏 frame.setUndecorated(true); - 新建一个水平布局的
JPanel作为自定义标题栏容器,按需求依次添加:窗口图标JLabel、JMenuBar实例、窗口标题JLabel、自定义的最小化/最大化/关闭按钮 - 补充基础交互逻辑:给标题栏添加鼠标监听器实现窗口拖拽移动功能,给三个控制按钮绑定对应窗口状态操作逻辑,可额外添加窗口边缘拖拽缩放逻辑
- 将自定义标题栏添加到
JFrame的BorderLayout.NORTH位置,下方放置窗口原有内容区域即可 - 可搭配
JFrame.setRootPaneCheckingEnabled(false)调整边框间距,避免出现多余空白
方案2:用FlatLaf外观库实现(推荐,无需重复开发)
FlatLaf是Swing生态目前应用最广的现代化外观库,原生支持菜单栏嵌入标题栏特性,仅需简单配置即可实现效果,适配Java 8及以上所有版本:
- 引入FlatLaf依赖后,先将全局外观切换为FlatLaf的任意主题
- 开启嵌入式菜单栏配置:
UIManager.put("TitlePane.menuBarEmbedded", true); - 正常调用
JFrame.setJMenuBar()添加菜单栏即可,FlatLaf会自动将菜单栏嵌入标题栏的图标和标题之间的位置,自带窗口拖拽、控制按钮、系统适配等完整功能,最终效果和VSCode完全一致
参考效果

内容的提问来源于stack exchange,提问作者Ruthvik
相关产品推荐
相关产品推荐

