gpt4 book ai didi

java - 错误或功能 : Swing default gui font incorrect for Win6+

转载 作者:太空狗 更新时间:2023-10-29 22:47:48 24 4
gpt4 key购买 nike

刚刚(令人惊讶地 ;-) 注意到应用程序在我的 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]

后者在几乎所有文本的 native 应用程序中使用,而 Swing 使用前者......

问题:

  • 这有什么原因吗,或者只是一个错误?
  • 谁负责:Swing 查找(从相关系统资源读入 desktopProperty 时)还是操作系统未正确报告?
  • 如何强制使用后者?

解决最后一个的选项:

  • 有了对 LAF 的完全控制,人们可能会考虑设置所有相关的文本字体(这就是 JGoodies 所做的,考虑到 FontPolicy/Set 中)。
  • 一个肮脏的 hack 是将 defaultGUI 桌面属性的值设置为正确的值 - 它涉及对工具包的反射访问,这自然会在安全受限的上下文中崩溃。
  • ??

编辑

为了以防万一有人感兴趣,这是肮脏的技巧:

/**
* 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 完全忽略系统设置,Metal 部分忽略:后者的字体始终是 Dialog,仅大小取自 desktopProperties。听起来不错,但事实并非如此:主要字体 f.i. 的映射相当奇怪。大量使用的 controlFont 大小设置为“win.ansiVar.font.height”(那是什么化石遗留下来的?)在我的机器上是 13 ...

编辑3

即使在 windows ui 中,hack 也是……有局限性的 hack,f.i. @Walter 评论中提到的那些:

This bug is especially noticeable when you scale the Windows UI. FYI, opening a JFileChooser reverts the hack. Also JTree/JTable row height will not be automatically updated to the new font size and you'll need to scale your icons as well

最佳答案

我认为这不是错误,而是 Win7 和内置主题的基本属性,有趣的字体大小,我仍然使用较小的字体(操作系统安装的默认设置)

例如如果我设置/切换

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]

关于java - 错误或功能 : Swing default gui font incorrect for Win6+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com