我在使用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获得这个假定的解决方案?
提前致谢 .
Edit:
最小的工作范例:
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个像素的文本 .
当我在MS Office,Libre Office或Scribus中使用Arial,12pt写入文本并将其缩放到100%时,结果是屏幕上的高度为12像素 .
令人惊讶的是,我刚刚发现,带有Arial,12pt的gimp中的文本也会产生9像素的高度 . 那么也许这根本不是Java问题?