解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法
在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出现。说这是 Java Swing 的 bug 还是 GTK+/GNOME 3 的主题(如 Adwaita)的 bug 其实意义不是太大。这里给出一个简单的解决办法,其思路是修改 GTK+/GNOME 3 的主题,这里以系统默认的 Adwaita 主题为例:
Adwaita 主题文件位于 /usr/share/themes/Adwaita 目录下,其中包含 gtk-2.0、gtk-3.0、qt 等几个子目录,我们要修改的是 gtk-2.0 子目录中的主题配置文件。进入 /usr/share/themes/Adwaita/gtk-2.0 目录,编辑 main.rc 文件,找到“style "menu" {”这一行(大概是第1520 行),将 xthickness 及 ythickness 设置为:
xthickness = 1 ythickness = 1
然后在下面增加如下内容:
engine "pixmap" { image { function = BOX file = "assets/line.png" } }
上述修改后,style "menu" 部分看起来应该类似下面这样:
style "menu" { xthickness = 1 ythickness = 1 bg[NORMAL] = @base_color bg[INSENSITIVE] = @base_color bg[PRELIGHT] = @base_color bg[SELECTED] = @selected_bg_color engine "pixmap" { image { function = BOX file = "assets/line.png" } } }
然后再找到“style "separator_menu_item" {”这一行,将其修改为如下内容:
style "separator_menu_item" { xthickness = 1 ythickness = 1 engine "pixmap" { image { function = BOX file = "assets/line.png" } } }
修改完后保存 main.rc,重新启用 Adwaita 主题生效后,就会发现 Java Swing 程序使用 GTK+ 主题后菜单边框终于正常出现啦。对于其他 GTK+/GNOME 3 主题如果出现类似 Adwaita 主题这种情况,也可以采用上述方法来解决。