2

JCOmponent の paintComponent() メソッドをオーバーライドし、ウィンドウにテキストを描画しています。私はUbuntuで実行しており、フォント「Ubuntu Mono」(Ubuntuテキストエディターのデフォルトフォント)を使用しています。私のJavaアプリがテキストを表示すると、弱々しくぼやけて見えます。私は何を間違っていますか?

私はこのようなテキストを描いています:

graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
Font font = new Font("Ubuntu Mono", Font.PLAIN, 18);
fontMetrics = graphics.getFontMetrics(font);
graphics.setFont(font);
graphics.drawString(value, getX(), getY() + fontMetrics.getHeight());

私のJavaアプリでは、次のようになります。

Java アプリのテキスト

Ubuntu TextEditor では、次のようになります。

ここに画像の説明を入力

.png編集:の代わりに画像を使用すると、パフォーマンスが低下しdrawText()ますか? これはビジネス アプリケーションであり、滑らかなアニメーションが必要なゲームではありません。

編集: TextEditor の色と一致するように色を変更しましたが、実際には品質が少し向上しましたが、文字はまだ非常に細いです...「.」はほとんど見えません. gimp では、アンチエイリアスをオンにして適切なフォントでテキストを作成することにより、TextEditor の外観を再現できます。

4

4 に答える 4

3

不思議なことに、「UbuntuMono」の代わりに「Monospaced」を使用してみました。

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

そしてそれは私にとって十分によく見えます。それが私が使用するものです。

于 2012-07-17T13:31:03.457 に答える
2

.png 画像を読み取り、BufferedImage にキャッシュします。パフォーマンスが低下することはありません。実際、このような中間イメージを使用すると、最初にテキストを描画するよりもパフォーマンスが向上します。

次のように互換性のある画像にしてください。

private Image getCompatibleImage(BufferedImage img) throws IOException {
        GraphicsConfiguration c = GraphicsEnvironment
                .getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration();

        if (c.getColorModel().equals(img.getColorModel()))
            return img;

        BufferedImage compatible = c.createCompatibleImage(img.getWidth(),
                img.getHeight());
        Graphics cg = compatible.getGraphics();
        cg.drawImage(img, 0, 0, null);
        cg.dispose();

        return compatible;
    }

これにより、一部のモニターでピクセルごとの変換が節約され、パフォーマンスが向上します。

于 2012-07-15T03:54:23.200 に答える
1

あなたは必ずしも間違ったことをしているわけではありません。RenderingHints(強調鉱山)のAPIから:

これらのキーと値はヒントであり、特定の実装が以下に示すすべての可能な選択肢をサポートする、またはアルゴリズムの選択を変更する要求に応答できるという要件はありません。さまざまなヒント キーの値は、ある状況では特定のキーのすべてのバリアントがサポートされる一方で、他のキーに関連付けられた値が変更されると実装がより制限されるように相互作用する場合もあります。[をちょきちょきと切る]

実装はヒントを完全に無視することができますが、リクエストにできるだけ近い実装アルゴリズムを使用するようにしてください。

于 2012-07-14T18:37:29.280 に答える
1

ヒントのレンダリングを強制する代わりに、フォントにネイティブのデスクトップ設定を使用してみてください。

Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));

...

if (desktopHints != null) {
    graphics.addRenderingHints(desktopHints);
}

(ソース-不潔なリッチ クライアント)

編集:

テキストのレンダリング品質を制御するためのさまざまなヒントを試してみてください。ここに参照があります。

于 2012-07-14T18:38:57.977 に答える