我正在使用一个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)
任何人都知道会发生什么事吗?
在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)
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)
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |