我有一个已经编写好的 Java Swing 应用程序(所以没有切换 UI 框架),我希望使用 GTKLookAndFeel 看起来至少不错。我已经考虑了 LookAndFeels 中的字体和组件大小差异等问题,但我无法弄清楚的一件事是为什么我的弹出菜单根本没有边框。看来他们正在使用看起来不像 GTK 原生的 Synth 边框。我希望能够支持 Metal、Windows 和 GTK,但是这些弹出窗口看起来很糟糕。这是一个错误吗?在不影响其他看起来不错的 LookAndFeels 边界的情况下,有什么好的(非 hacky)方法来解决这个问题?
3 回答
在我看来,GTK LaF 被设计破坏了。它不尊重看似随机的 JCOMponents 的程序员 UI 设置(字体颜色边框背景等)。这是因为它从 .gtkrc 文件中获取其设置,而不是 setXXX(...) 调用。对于 Linux,我会坚持使用 Metal,而对于 windows,我会坚持使用“native”。
回复:
GTK+ 的外观可以通过资源文件进行定制。Swing 的 GTK+ 外观使用以下算法来定位资源文件:
- 如果系统属性swing.gtkthemefile存在,解析并停止,例如:java -Dswing.gtkthemefile=/tmp/customTheme -jar SwingSet2.jar。
- 如果文件 user.home/.gtkrc-2.0 存在,解析它并继续。
- 通过使用 XSETTINGS 确定的桌面属性 gnome.net/ThemeName 确定用户选择的主题名称 (THEMENAME)。如果此属性为空,则使用 Default 作为 THEMENAME。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/share/themes/THEMENAME/gtk/gtkrc。
定制 GTK+ 的一种方式是通过主题引擎。存在少数引擎。在 1.4.2 中,Swing 支持 Default、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 文件中获取其主题,或者不支持当前的边框选项。
我知道回复迟了,但如果有人在谷歌上看到这个问题(就像我一样),那么我发现这个解决方案总比没有好:
if (UIManager.getLookAndFeel().getClass().getName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"))
aPopupMenu.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray));
它似乎不适用于添加到弹出菜单的菜单(即使您在它们上调用该函数),但它确实在主菜单上显示了边框。