为什么Java的GtkLookAndFeel Popups没有边框?

时间:2009-07-18 22:16:45

标签: java swing gtk look-and-feel

我有一个已经编写过的Java Swing应用程序(所以没有切换UI框架)我希望看起来至少使用GTKLookAndFeel。我已经考虑过LookAndFeels中字体和组件大小差异等问题,但有一点我无法弄清楚为什么我的弹出菜单根本没有边框。看起来他们正在使用不看起来像GTK本地的Synth边框。我希望能够支持Metal,Windows和GTK,但这些弹出窗口看起来很糟糕。这是一个错误吗?什么是一个很好的(非hacky)方法解决这个问题而不影响其他看起来很好的LookAndFeels边框?

3 个答案:

答案 0 :(得分:2)

在我看来,GTK LaF被设计打破了。对于看似随机的JCOmponents,它尊重程序员UI设置(字体颜色边框背景等)。这是因为它从.gtkrc文件获取其设置,而不是setXXX(...)调用。我坚持使用Metal for Linux和'native'for windows。

回应:

  

GTK +的外观和感觉都可以   通过资源文件定制。   Swing的GTK +外观使用了   以下算法来定位   资源文件:

     
      
  1. 如果系统属性swing.gtkthemefile存在,请解析它   并停止,例如:java   -Dswing.gtkthemefile = / tmp / customTheme -jar SwingSet2.jar。
  2.   
  3. 如果文件user.home / .gtkrc-2.0存在,请解析并继续。
  4.   
  5. 通过以下方式确定用户选择的主题名称(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。
  6.         

    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

中的Mint主题中有/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个问题:

  • 缺少菜单边框。
  • 激活的复选框和单选按钮菜单项的字体颜色错误(字体颜色与背景颜色相同,看起来不可见)。
  • 没有菜单分隔符。