Swing字体看起来比它们应该小

时间:2016-11-26 20:17:29

标签: java swing fonts

我正在使用需要显示给定字体大小的文本的Swing程序。但是我注意到在Swing中,文本看起来比应该的要小很多。与例如Microsoft Word相比,文本在小字体大小时几乎不可读。

Swing和Microsoft Word都在使用Arial,8。区别很明显。 enter image description here

对于那些想要尝试的人,这是一个小例子:

STACK 'STACK'

任何人都知道会发生什么事情?

3 个答案:

答案 0 :(得分:4)

在java Documentations中,Font应该以pt的大小获得,但它似乎使用了px。

所以你的文字不是8pt(就像在word或libre office,...)它的8像素高度。您可以将pt转换为px(8pt = ~10px)

enter image description here

转换的确切公式并不那么简单,因为它的设备特定,但你可以使用(正确的ppi = 96):

pt = px*0.75
px = pt/0.75

此公式不准确,但您可以在我的测试图片中看到: 10 / 0.75 = = 7.5pt(大小10最接近文字)

如果您希望它尽可能准确,您可以为您的设备计算: a pt定义为1/72 in(见wikipedia) 所以公式是:

px = pt / (72 / ppi); //ppi = points per inch

在java中你可以这样做:

public int pointToPixel(float pt){
   int ppi = Toolkit.getDefaultToolkit().getScreenResolution();
   return (int) Math.round(pt / (72 / ppi));
}

答案 1 :(得分:2)

在Java中绘制文本时,点大小使用像素,这意味着整个文本将垂直放置在8个像素内,包括“y”和“g”的底部。但是在MS Word中(你应该使用OpenOffice而不是),文本的主体是8像素,不包括字母的底部,使它看起来更大。这似乎是Swing本身的一个问题。

答案 2 :(得分:2)

Java试图容纳所有平台并且它做得很好但是会出现一些异常情况,您需要作为开发人员来处理。不幸的是,当专门为Microsoft Windows平台开发时,一个这样的异常是字体大小。大多数开发人员并不真正关心字体大小,因为他们希望他们的应用程序在所有平台上运行,只需允许用户修改字体大小。

Java中8磅字体大小变小的基本原因仅仅是因为Java 2D和Windows假设的屏幕分辨率(DPI)不同。虽然Java假设72 dpi的屏幕分辨率,Windows使用96 dpi甚至120 dpi,具体取决于显示属性中的字体大小设置。请阅读this了解详情。

如果您要在MacOS X上运行代码示例并比较显示的文本,您很可能会发现字体大小看起来相同。您不会在MS Windows框中获胜。所以,尽管如此,你可以做出一些选择;

1)更改Windows操作系统高级显示设置中的DPI缩放级别(Windows10),以便适应您的应用程序;

2)更改您的代码以适应Windows操作系统,如果它碰巧在一个肯定会出现的情况下运行。因此,您需要检测应用程序正在使用的操作系统(例如: System.getProperty(" os.name");

3)使用它,只需使用您满意的字体大小(但请记住,它在MS Windows平台上可能看起来太大了。)

如果您正在考虑选择2,那么您可以这样做:

可用于转换Java字体大小以适应Windows操作系统平台的方法:

public static double ConvertFontSizeForWindows(double fontSize) {
    // Are we running within a Windows plateform?
    if (System.getProperty("os.name").toLowerCase().contains("windows")) {
        //Yes...so let's convert the font size to accomdate windows.
        int screenRes = Toolkit.getDefaultToolkit().getScreenResolution();
        return (double)Math.round(fontSize * screenRes / 72.0); 
    }
    // No...Just return the original font size.
    return fontSize;
}

此方法需要将字体大小作为Double数据类型提供,并且它返回Double数据类型,因为字体大小不一定真正表示为整数。

您可以在示例代码中使用此方法,如下所示:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 200);
    frame.setLocationRelativeTo(null);

    JLabel label = new JLabel("This is my test text which should look bigger");
    int convertedFontSize = (int) ConvertFontSizeForWindows(8.0);
    label.setFont(new Font("Arial", Font.PLAIN, convertedFontSize));

    frame.add(label);

    frame.setVisible(true);
}