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

时间:2013-09-16 12:19:22

标签: java fonts java-7

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

g2.drawString("some text", 100, 100);

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

enter image description here

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

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

更新:这是摩纳哥的比较: enter image description here

和摩纳哥的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);

enter image description here

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

 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                    RenderingHints.VALUE_ANTIALIAS_ON);

1 个答案:

答案 0 :(得分:14)

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

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

Apple非常关注设计。甲骨文......嗯......不是那么多(exhibit Aexhibit B

你能做什么?

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

相关文章: