Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(DPI)在Java Swing(和Windows)中缩放字体_Java_Swing_Fonts_Scaling_Dpi - Fatal编程技术网

(DPI)在Java Swing(和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的缩放比例 因此,

我正在尝试手动缩放我的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的缩放比例

因此,问题是:

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


  • 谢谢

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

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

    通过遵循此方法,选择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的每
    96
    px的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;
            }
        }