只是(令人惊讶地 ;-) 注意到应用程序在我的 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 所做的,将其纳入 FontPolicy/Set)。
- 一个肮脏的技巧是将 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
澄清一下:该 hack 仅对 WindowsLAF 完全有效。Nimbus 完全忽略系统设置,Metal 部分忽略:后者的字体始终是 Dialog,只有大小取自 desktopProperties。听起来不错,但不是:主要字体的映射相当奇怪,因为大量使用的 controlFont 大小设置为“win.ansiVar.font.height”(那是什么化石剩余?)这是 13在我的机器上...
编辑 3
即使在 Windows ui 中,黑客也是......有限制的黑客,fi 那些在@Walter 的评论中提到的:
当您缩放 Windows UI 时,此错误尤其明显。仅供参考,打开 JFileChooser 会恢复黑客攻击。此外,JTree/JTable 行高不会自动更新为新的字体大小,您还需要缩放图标