如何使用Java 7中的FRACTIONALMETRICS呈现文本

Sam*_*chi 6 java swing java-2d text-rendering java-7

我正在使用桌面Java应用程序,并且已经使用JDK 6通过IDE进行开发.我使用渲染提示VALUE_FRACTIONALMETRICS_ON和其他提示来更好地渲染JLabel中的文本.这些提示在JVM 1.6上运行得非常漂亮,但我最近注意到,VALUE_FRACTIONALMETRICS_ON当我使用JRE运行应用程序时,它似乎完全忽略了1.7我在这里做错了什么让Java 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);
    }
};
Run Code Online (Sandbox Code Playgroud)

FRACTIONALMETRICS对文本具有最明显的视觉效果,因此让我的工作就是我想要做的.

这是一个屏幕截图比较,当我从我的IDE()运行应用程序时使用Java 6,当我双击Jar文件时,它自己()使用我的系统JRE,Java 7.(我还临时添加红色边框以显示paint方法确实有效)

任何帮助将非常感谢.

sin*_*a72 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);
    }
}
Run Code Online (Sandbox Code Playgroud)