17

私はJavaで開発環境を構築してきました(小さな研究プロジェクトとして)。その一環として、次のように Graphics2d を使用してテキスト自体を描画するカスタム テキスト コンポーネントを作成しました。

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

すべてをパッケージ化して Java 1.7 (Oracle 提供) で実行するまで、Eclipse で 1.6 (これは Apple によって提供されていると思います) を使用して問題なく開発できました。明らかに、開発環境ではフォントはかなり重要なので、1.7 での結果を見てがっかりしました。

ここに画像の説明を入力

カスタム フォントをパッケージ化しようとしましたが、すべて粒子が粗く、侵食されて表示されます。上記の比較はそれほど悪くはありませんが、一部のフォント (Monaco など) は見栄えが悪くなります。

これは、Apple が Quartz に接続する方法に関係していると思います。しかし、他のシステムで見栄えが悪くならないように改善する方法はありますか? 誰かがこれに対する戦略を持っていますか?

更新: これはモナコでの比較です: ここに画像の説明を入力

Monaco の 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);

ここに画像の説明を入力

以下を使用してアンチエイリアシングがオンになっていることにも注意してください。

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

1 に答える 1

14

Java 6 は Apple によって開発されました。Apple は、Quartz/Cocoa で動作するように、特に見栄えを良くするために、グラフィックス レイヤーに多くの作業を行いました。

Java 7 では、開発は Oracle に引き継がれました。これは、Oracle が Apple から情報源を得たという意味ではありません。代わりに、最初からやり直しました (おそらく、いくつかの Unix コードを OS X に移植しました)。これは、OS X で Java の見栄えを良くするために Apple が行ったすべての作業が基本的に失われたことを意味します。

アップルはデザインにとても気を使っています。オラクル ... うーん ... あまり (展示品 A ,展示品 B )

あなたは何ができますか?

  • OpenJDK へのパッチを作成して送信します。
  • Apple にパッチを提出するように依頼する気のある人を十分に集めてください (お金が役立つかもしれません)。
  • Java 6 に戻る
  • JNI を使用して Cocoa/Quartz に直接アクセスし、OS X フォント レンダリング エンジンを取得します。

関連記事:

于 2013-09-16T14:31:43.440 に答える