(DPI)在Java Swing(和Windows)中缩放字体
我正在尝试手动缩放我的JavaSwing应用程序中的一些字体(例如,对于高分辨率屏幕) 在96 DPI(100%),Windows的外观告诉我默认字体是Tahoma大小11。(在WLF中使用Label.font) 200%是21,300%是32,400%是43,500%是53。(请注意,点大小==字体上升) 我最初的做法是采用“我的”默认字体:Tahoma size 11。然后计算比例因子(即200%为2.0)。从那里我想计算字体的大小,但是做一个直接的乘法不符合Windows的缩放比例 因此,问题是:(DPI)在Java Swing(和Windows)中缩放字体,java,swing,fonts,scaling,dpi,Java,Swing,Fonts,Scaling,Dpi,我正在尝试手动缩放我的JavaSwing应用程序中的一些字体(例如,对于高分辨率屏幕) 在96 DPI(100%),Windows的外观告诉我默认字体是Tahoma大小11。(在WLF中使用Label.font) 200%是21,300%是32,400%是43,500%是53。(请注意,点大小==字体上升) 我最初的做法是采用“我的”默认字体:Tahoma size 11。然后计算比例因子(即200%为2.0)。从那里我想计算字体的大小,但是做一个直接的乘法不符合Windows的缩放比例 因此,
谢谢 在我的例子中,我的解决方案是迭代每个字体大小,检查测试字符串的宽度,并在最接近(但不大于)缩放宽度大小的字体处停止 这类似于根据特定组件的大小调整字体大小。需要注意的一点是,我必须为测试字符串选择一个相对较长的字符串 通过遵循此方法,选择Tahoma 21作为200%(192 DPI)的正确字体。大致如下:
while(true) {
Font newFont = font.deriveFont((float)fontSize + 1);
int newWidth = StyleContext.getDefaultStyleContext().getFontMetrics(newFont).stringWidth(TEST_STIRNG);
if(newWidth <= targetWidth) {
fontSize++;
} else {
System.out.println("Rejected Font:" + newFont.getName() + " size:" + newFont.getSize() + " width: " + newWidth);
break;
}
}
while(true){
Font newFont=Font.deriveFont((浮点)fontSize+1);
int newWidth=StyleContext.getDefaultStyleContext().getFontMetrics(newFont).stringWidth(TEST\u STIRNG);
if(newWidth)为什么不问问Java底层的dpi是什么?如果你想补偿高dpi的显示,那么把Tahoma的每96px的dpi设置为11*[real]/96
px每[real]
dpi,谢谢你的评论。我正是这样做的,我通过询问dpi来计算缩放因子(我能做的最好)除以96(即100%)。问题是@192 dpi,Windows外观告诉我Tahoma的大小是21。当我进行缩放*11计算时,你得到的是点大小22(11*192/96)这实际上听起来不像是点舍入的结果,而是一个问题。11px实际上可能不是一个真正的像素值,而是一个(分数)pt
值的像素表示,在这种情况下,192dpi处的21px很容易是由于下限(…)
关于从pt
到px
的转换结果。在这一点上,您可能需要知道您使用的是哪个文本整形器(GDI、GDI+、DirectWrite?),或者根据容器的尺寸设置字体大小。@Mike'Pomax'Kamermans“为什么不问问Java底层dpi是什么?”-因为通常情况下,Java不能告诉您(或者至少不能准确地告诉您),较新的Java(java11)可以准确地告诉dpi
while(true) {
Font newFont = font.deriveFont((float)fontSize + 1);
int newWidth = StyleContext.getDefaultStyleContext().getFontMetrics(newFont).stringWidth(TEST_STIRNG);
if(newWidth <= targetWidth) {
fontSize++;
} else {
System.out.println("Rejected Font:" + newFont.getName() + " size:" + newFont.getSize() + " width: " + newWidth);
break;
}
}