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

2022-09-03 02:25:58

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

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

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

enter image description here

我尝试过打包自定义字体,但它们都显得颗粒状和侵蚀。上面的比较不是太糟糕,但有些字体(如摩纳哥)看起来很糟糕。

我猜这与苹果如何将事物与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

Java 6由苹果公司开发。苹果在图形层中投入了大量工作,使其与Quartz / Cocoa配合使用,特别是使其看起来不错。

对于Java 7,开发由Oracle接管。这并不意味着甲骨文从苹果那里获得了消息来源。相反,他们重新开始(可能将一些Unix代码移植到OS X)。这意味着苹果为使Java在OS X上看起来不错而付出的所有工作基本上都丢失了。

苹果非常关心设计。神谕。。。井。。。没有那么多(展品A展品B)

你能做些什么?

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

相关文章:


答案 2

推荐