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

如何在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完全一致

参考效果

VSCode嵌入菜单栏的标题栏示例


内容的提问来源于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:27:01