我有一个已经编写过的Java Swing应用程序(所以没有切换UI框架)我希望看起来至少使用GTKLookAndFeel。我已经考虑过LookAndFeels中字体和组件大小差异等问题,但有一点我无法弄清楚为什么我的弹出菜单根本没有边框。看起来他们正在使用不看起来像GTK本地的Synth边框。我希望能够支持Metal,Windows和GTK,但这些弹出窗口看起来很糟糕。这是一个错误吗?什么是一个很好的(非hacky)方法解决这个问题而不影响其他看起来很好的LookAndFeels边框?
答案 0 :(得分:2)
在我看来,GTK LaF被设计打破了。对于看似随机的JCOmponents,它不尊重程序员UI设置(字体颜色边框背景等)。这是因为它从.gtkrc文件获取其设置,而不是setXXX(...)调用。我坚持使用Metal for Linux和'native'for windows。
回应:
GTK +的外观和感觉都可以 通过资源文件定制。 Swing的GTK +外观使用了 以下算法来定位 资源文件:
- 如果系统属性swing.gtkthemefile存在,请解析它 并停止,例如:java -Dswing.gtkthemefile = / tmp / customTheme -jar SwingSet2.jar。
- 如果文件user.home / .gtkrc-2.0存在,请解析并继续。
- 通过以下方式确定用户选择的主题名称(THEMENAME) 桌面属性gnome.net/ThemeName 这是使用XSETTINGS确定的。 如果此属性为null,请使用“默认” 作为主题。 1.如果文件为user.home / .themes / THEMENAME / gtk-2.0 / gtkrc 存在解析它并停止。 2.如果存在系统属性swing.gtkthemedir和文件 swing.gtkthemedir / THEMENAME / GTK-2.0 /的gtkrc 存在,解析并停止。 3.如果系统属性swing.gtkthemedir不存在且 文件 /usr/share/themes/THEMENAME/gtk-2.0/gtkrc 存在,解析并停止。 4.最后如果定义了swing.gtkthemedir解析 swing.gtkthemedir / THEMENAME / GTK /的gtkrc, 否则解析 的/ usr /共享/主题/ THEMENAME / GTK /的gtkrc。
醇>GTK +的一种定制方式是 主题引擎的方式。少数 引擎存在。在1.4.2中,Swing 支持默认的主题文件, pixmap和bluecurve引擎。我们是 调查打开API的方法 允许创建 额外的GTK引擎。访问 http://www.themes.org例如 - http://java.sun.com/j2se/1.4.2/docs/guide/swing/1.4/Post1.4.html
我的猜测是java从另一个rc文件中获取主题,或者不支持当前的边框选项。
答案 1 :(得分:2)
我知道答案是迟来的,但如果有人在谷歌上看到这个问题(就像我做的那样)那么我发现这个解决方案总比没有好:
if (UIManager.getLookAndFeel().getClass().getName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"))
aPopupMenu.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray));
它似乎不适用于添加到弹出菜单的菜单(即使你在它们上面调用了这个功能),但它确实显示了主菜单上的边框。
答案 2 :(得分:1)
存在不兼容的rc文件。
不幸的是,these博客已关闭。
Ubuntu / Gnome Shell:,例如/usr/share/themes/Adwaita/gtk-2.0/gtkrc
style "menu" {
xthickness = 1
ythickness = 1 ...
}
... style "separator_menu_item" {
xthickness = 1
ythickness = 1
... }
2015年11月30日更新:对于 Ubuntu / Unity ,请参阅http://www.ailis.de/~k/ =>全局菜单,原生字体。
在 Linux Mint 上,menus.rc
/usr/share/themes/[mint-theme]/gtk-2.0/style
个文件
在 style“menu”部分中更改:
xthickness = 0
ythickness = 0
text[ACTIVE] = @base_color
为:
xthickness = 1
ythickness = 1
text[ACTIVE] = @fg_color
在 style“menu-item-separator”部分中,更改条目:
ythickness = 0
为:
ythickness = 1
我为Mint写了一个http://blog.hani-ibrahim.de/en/ubuntus-swing-gtk-laf.html,它会自动完成这项工作。它解决了所有3个问题: