我正在使用需要显示给定字体大小的文本的Swing程序。但是我注意到在Swing中,文本看起来比应该的要小很多。与例如Microsoft Word相比,文本在小字体大小时几乎不可读。
Swing和Microsoft Word都在使用Arial,8。区别很明显。
对于那些想要尝试的人,这是一个小例子:
STACK 'STACK'
任何人都知道会发生什么事情?
答案 0 :(得分:4)
在java Documentations中,Font应该以pt的大小获得,但它似乎使用了px。
所以你的文字不是8pt(就像在word或libre office,...)它的8像素高度。您可以将pt转换为px(8pt = ~10px)
转换的确切公式并不那么简单,因为它的设备特定,但你可以使用(正确的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);
}