如何获得Java2D的假定屏幕分辨率?

时间:2018-08-27 12:20:05

标签: java swing fonts

我在装有Java 8的Windows 7机器上使用Swing和Java2D,但我的Java字体呈现的字体比我给定的字体大小和屏幕分辨率要小得多。

根据this old article,原因可能是我的屏幕分辨率和Java2D的假定屏幕分辨率之间的差异。作者Thomas Krammer建议了以下解决方法:

public void paintComponent(Graphics g)
{
    Graphics2D g2d = (Graphics2D)g;

    int screenRes = Toolkit.getDefaultToolkit().getScreenResolution();
    int fontSize = (int)Math.round(12.0 * screenRes / 72.0);

    Font font = new Font("Arial", Font.PLAIN, fontSize);

    g2d.setFont(font);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.drawString("Hello World", 25, 100);
}

在我看来,这似乎很好。但是,我非常想避免将72 dpi硬编码到我的程序中,而是从它的原始位置获取它。

有人知道如何从Java2D中获得此假定的分辨率吗?

谢谢。

修改:
最小的工作示例:

package fontmagic;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class FontMagic
{
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("Font Magic");
    JPanel panel = new JPanel(new BorderLayout());
    JLabel label = new JLabel("This is Text with a font size.");

    frame.setSize(new Dimension(400, 200));
    frame.setVisible(true);
    frame.add(panel);
    panel.add(label, BorderLayout.CENTER);
    label.setFont(new Font("Arial", Font.PLAIN, 12));
  } 
}

此代码在我的屏幕上生成9像素高的文本。

当我使用Arial在MS Office,Libre Office或Scribus中编写文本时,将其放大12pt并将其缩放到100%,结果是屏幕上的高度为12像素。

令人惊讶的是,我刚刚发现,带有Arial,12pt的gimp文本也产生了9像素的高度。所以也许这根本不是Java问题吗?

0 个答案:

没有答案