为什么java 1.7中的字体与1.6不同?

ali*_*air 17 java fonts java-7

我一直在用Java构建开发环境(作为一个小型研究项目).作为其中的一部分,我构建了一个自定义文本组件,使用Graphics2d绘制文本本身,如下所示:

g2.drawString("some text", 100, 100);
Run Code Online (Sandbox Code Playgroud)

使用1.6(我假设这是由Apple提供),所有东西都在Eclipse中很好地开发,直到我打包并运行java 1.7(由Oracle提供).显然在开发环境中字体非常重要,所以我很不高兴看到1.7中的结果.

在此输入图像描述

我尝试过包装自定义字体,但它们都显得粗糙和腐蚀.上面的比较并不算太差,但有些字体(如摩纳哥)看起来很糟糕.

我猜这与Apple如何将事物挂钩到Quartz有关.但有没有办法改善事物,所以它在其他系统上看起来并不可怕?有没有人有这个策略?

更新:这是摩纳哥的比较: 在此输入图像描述

以及摩纳哥C(在paintComponent中)的缩放比较(左边是1.7,右边是1.6).请注意,我正在使用以下方法从本地ttf文件加载字体:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("monaco.ttf");
Font customFont = null;
try
{
customFont = Font.createFont(Font.TRUETYPE_FONT, is);
customFont = customFont.deriveFont(16.0f).deriveFont(Font.BOLD);
                    is.close();
                    ge.registerFont(customFont);
                } catch (FontFormatException e1)
                {
                    e1.printStackTrace();
                } catch (IOException e1)
                {
                    e1.printStackTrace();
                }
this.setFont(customFont);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另请注意,使用以下命令打开抗锯齿:

 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                    RenderingHints.VALUE_ANTIALIAS_ON);
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 14

Java 6由Apple开发.Apple在图形层中投入了大量精力,使其与Quartz/Cocoa一起使用,尤其是使其看起来更好.

对于Java 7,开发由Oracle接管.这并不意味着Oracle从Apple获得了消息来源.相反,他们重新开始(可能将一些Unix代码移植到OS X).这意味着Apple在OS X上使Java看起来很好的所有工作基本上都失败了.

Apple非常关心设计.甲骨文......嗯......没那么多(展览A,展览B)

你能做什么?

  • 编写并向OpenJDK提交补丁.
  • 让足够多的人关心要求Apple提交补丁(金钱可能有所帮助).
  • 回到Java 6
  • 使用JNI直接访问Cocoa/Quartz,以便获得OS X字体渲染引擎.

相关文章: