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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决 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 主题这种情况,也可以采用上述方法来解决。

以上是关于解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法的主要内容,如果未能解决你的问题,请参考以下文章

GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建(十几篇)

HOWTO:使用 gtk (rust-gnome) 回调的惯用 Rust

学习GTK+ ——编写helloworld

Linux那些事——GTK+, Qt, Gnome, KDE, xWindow, xOrg区别

Unity如何安装Gnome-look上的GTK3主题?