(DPI) 在 Java Swing(和 Windows)中缩放字体

(DPI) Scaling fonts in Java Swing (and Windows)

我正在尝试手动缩放我的 Java Swing 应用程序中的某些字体(即,对于高分辨率屏幕)。

在 96 DPI (100%) 时,Windows 外观告诉我默认字体是 Tahoma 大小 11。(在 WLF 中使用 Label.font) 200% 是 21,300% 是 32,400% 是 43,500% 是 53。(注意点大小 == 字体上升)

我原来的做法是采用"my"默认字体:Tahoma size 11。然后计算比例因子(即2.0代表200%)。从那里我想计算字体磅值,但是直接乘法不符合 Windows 缩放,

所以问题:

  1. 字体缩放在 Windows 中如何工作? 和
  2. 如何缩放字体? (还有对组件等进行的其他缩放) 我的应用程序中的两种主要字体是 Tahoma(11) 和 Segoe UI (12).

    new WindowsLookAndFeel().getDefaults().getFont("Label.font") //returns 11 @ 100%
    
    Font font = StyleContext.getDefaultStyleContext().getFont("Tahoma",  Font.PLAIN, 11); //my inital Composite font (Tahoma with Dialog fallback)
    
    Font newFont = font.deriveFont(zoomFactor * 11); // this gets me 22 @ 200%
    

谢谢!

在我的例子中,我的解决方案是遍历每个字体大小并检查测试字符串的宽度,并在最接近(但不大于)缩放后的宽度大小的字体处停止。

这类似于根据特定组件的大小调整字体大小。需要注意的一点是,我必须为测试字符串选择一个相对较长的字符串。

按照此方法,选择 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;
        }
    }