错误或function:Win6 +的Swing默认gui字体不正确
只是(令人惊讶地;-)注意到我的win6 +机器上的应用程序看起来如此拥挤的原因(同样适用于Vista和Win7,120dpi设置,jdk6和jdk7):从桌面属性查找的控件字体都有错误的字体家庭和错误的大小:
public static void main(String[] args) { Font guiFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty("win.defaultGUI.font"); int guiSize = guiFont.getSize(); Font iconFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty("win.icon.font"); System.out.println("gui default: " + guiFont + "\nicon default: " + iconFont); }
输出:
gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=13] icon default: java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=15]
后者几乎用于所有文本的本机应用程序,而Swing使用前者…
问题:
- 可能有任何理由,或只是一个错误?
- 谁负责:Swing查找(从相关系统资源读取desktopProperty时)或操作系统未正确报告?
- 如何强制使用后者?
解决最后一个的选项:
- 通过完全控制LAF,人们可能会考虑设置所有相关的文本字体(这就是JGoodies的function,并将其纳入FontPolicy / Set)。
- 一个脏的hack是将defaultGUI桌面属性的值设置为正确的值 – 它涉及对工具包的reflection访问,这自然会在安全受限的上下文中发挥作用。
- ??
编辑
万一有人感兴趣,这是肮脏的黑客:
/** * Replaces the default gui desktop font property with the icon font * if the former is smaller. * */ public static void ensureDefaultGUIFontSize() { Toolkit toolkit = Toolkit.getDefaultToolkit(); Font guiFont = (Font) toolkit.getDesktopProperty("win.defaultGUI.font"); Font iconFont = (Font) toolkit.getDesktopProperty("win.icon.font"); if (guiFont.getSize() < iconFont.getSize()) { invokeDeclaredMethod("setDesktopProperty", Toolkit.class, toolkit, "win.defaultGUI.font", iconFont); } } private static void invokeDeclaredMethod(String methodName, Class clazz, Object instance, String propertyName, Object propertyValue) { try { Method method = clazz.getDeclaredMethod(methodName, String.class, Object.class); method.setAccessible(true); method.invoke(instance, propertyName, propertyValue); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { LOG.finer("forcing desktop property failed " + e.getStackTrace()); } }
编辑2
只是为了澄清:黑客只对WindowsLAF有效。 Nimbus完全忽略系统设置,部分是金属:后者的字体始终是Dialog,只有大小来自desktopProperties。 听起来中途好,但不是:主要字体的映射相当奇怪,使用频繁的controlFont大小设置为“win.ansiVar.font.height”(剩下的化石是什么?)这是13在我的机器上……
编辑3
即使在windows ui中,黑客也是……一个有限制的黑客,在@ Walter评论中提到的那些:
在缩放Windows UI时,此错误尤其明显。 仅供参考,打开JFileChooser可以恢复黑客攻击。 JTree / JTable行高也不会自动更新为新的字体大小,您还需要缩放图标
我认为这不是一个bug,而是Win7和built_in主题的基本属性,有趣的Font大小,我仍然使用较小的字体(OS安装的默认设置)
例如,如果我设置/切换
1.Windows7基本主题
gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] icon default: java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=12]
2.Windows7经典主题
gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] don't touched the Font property, will be continue for from WinXP
3.WindowXP修改主题
gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=13]
4.Windows7经典主题
gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11]