只是(令人惊讶地;-)注意到应用程序在我的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使用前者...
问题:
解决最后一项的选项:
修改
万一有人感兴趣,这是肮脏的黑客:
/**
* 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。听起来中途不错,但事实并非如此:主要字体f.i的映射相当奇怪。大量使用的controlFont大小设置为“win.ansiVar.font.height”(剩下的化石是什么?)在我的机器上是13 ...
编辑3
即使在windows ui中,hack也是......一个有限制的黑客,f.i。 @ Walter评论中提到的那些:
当您扩展Windows UI时,此错误尤其明显。仅供参考,打开JFileChooser可以恢复黑客攻击。 JTree / JTable行高也不会自动更新为新的字体大小,你也需要扩展你的图标
答案 0 :(得分:4)
我认为这不是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]