6

私が取り組んでいるデスクトップ Java アプリケーションがあり、IDE を介した開発に JDK 6 を使用しています。このレンダリング ヒントVALUE_FRACTIONALMETRICS_ONを他のヒントと一緒に使用して、JLabels でテキストをより適切にレンダリングします。これらのヒントは JVM 1.6 で美しく機能しますが、最近VALUE_FRACTIONALMETRICS_ON、JRE 1.7 でアプリを実行すると完全に無視されているように見えることに気付きました。

lblDate = new ATimeLabel(ATimeLabel.DATE_LETTERS) {
    private static final long serialVersionUID = 1L;

    @Override
    protected void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                RenderingHints.VALUE_FRACTIONALMETRICS_ON);

        super.paintComponent(g2d);
    }
};

FRACTIONALMETRICS は、テキストに最も顕著な視覚効果をもたらすので、それを機能させることが私がやろうとしていることです。

これは、Java 6 を使用するIDE からアプリを実行したとき () と、私のシステム JRE、Java 7 を使用した Jar ファイル自体 () をダブルクリックしたときのスクリーン ショットの比較です。また、ペイントメソッドが機能することを示すために一時的に赤い境界線を追加しました)

どんな助けでも大歓迎です。

4

1 に答える 1

3

通常は設定する必要はありませんVALUE_FRACTIONALMETRICS_ON。提供されているデスクトップ ヒントを使用してみてください。FontRenderContext からの Swing アンチエイリアシングのヒントを再確認することもできます。以下に使用例を示します。

分数メトリックの副作用であるテキストを太字にしたい場合は、太字のフォントを使用するか、出力を画像にレンダリングして、描画する前にぼかします。これにより、システムに依存しないソリューションが保証されます。

import java.awt.*;
import java.awt.event.*;
import java.util.Map;
import javax.swing.JLabel;

public class TextHints {
    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        JLabel label = new JLabel("Sunday, March 17") {
            @Override
            protected void paintComponent(Graphics g) {

                Graphics2D g2d = (Graphics2D) g;

                Map desktopHints = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
                if (desktopHints != null) {
                    g2d.addRenderingHints(desktopHints);
                    System.out.println("Desktop: " + desktopHints);
                }
                java.awt.FontMetrics fm = getFontMetrics(getFont());
                Object swingHint = fm.getFontRenderContext().getAntiAliasingHint();
                System.out.println("Swing AntiAliasingHint: " + swingHint);

                super.paintComponent(g2d);
            }
        };
        label.setBackground(Color.BLACK);
        label.setForeground(Color.LIGHT_GRAY);
        label.setOpaque(true);

        label.setFont(label.getFont().deriveFont(Font.BOLD, 14f));

        frame.add(label);
        frame.setSize(new Dimension(160, 100));
        frame.setVisible(true);
    }
}
于 2013-03-21T07:38:06.333 に答える