首页 > 代码库 > 解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法

解决 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 = 1ythickness = 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 主题这种情况,也可以采用上述方法来解决。

解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法