Swing字体看起来比应该的小

eri*_*c.m 1 java fonts swing

我正在使用一个Swing程序,该程序需要显示给定字体大小的文本。但是我注意到在Swing中,文本看起来比应该的要小得多。与Microsoft Word相比,使用小字体几乎无法读取该文本。

Swing和Microsoft Word都使用Arial8。区别很明显。 在此处输入图片说明

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

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");
    label.setFont(new Font("Arial", Font.PLAIN, 8));

    frame.add(label);

    frame.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*sto 5

在Java文档中,字体应以pt为单位获取大小,但似乎改用px。

因此,您的文本不是8pt高度的8pt(例如在文字或免费办公室中,...)。您可以将pt转换为px(8pt =〜10px)

在此处输入图片说明

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

pt = px*0.75
px = pt/0.75
Run Code Online (Sandbox Code Playgroud)

该公式并不准确,但是正如您在我的测试图像中所看到的:10 / 0.75 = = 7.5pt(大小10最接近单词文本)

如果您希望它尽可能准确,则可以为您的设备计算它:pt定义为1/72 in(请参阅Wikipedia),因此公式为:

px = pt / (72 / ppi); //ppi = points per inch
Run Code Online (Sandbox Code Playgroud)

在Java中,您可以这样做:

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


Dev*_*Hnd 5

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

Java 中的 8 点字体大小显得较小的根本原因仅仅是因为 Java 2D 和 Windows 假定的屏幕分辨率 (DPI) 不同。Java 假定屏幕分辨率为 72 dpi,而 Windows 使用 96 dpi 甚至 120 dpi,具体取决于“显示属性”中的字体大小设置。阅读本文了解更多详情。

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

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

2) 更改您的代码以适应 Windows 操作系统(如果碰巧在 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;
}
Run Code Online (Sandbox Code Playgroud)

此方法需要以 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);
}
Run Code Online (Sandbox Code Playgroud)