【问题标题】:How to render text using FRACTIONALMETRICS in Java 7如何在 Java 7 中使用 FRACTIONALMETRICS 呈现文本
【发布时间】:2013-03-08 16:11:49
【问题描述】:

我正在开发一个桌面 Java 应用程序,并且一直在使用 JDK 6 通过 IDE 进行开发。我使用渲染提示 VALUE_FRACTIONALMETRICS_ON 以及其他提示来更好地在 JLabels 中渲染文本。这些提示在 JVM 1.6 上运行良好,但我最近注意到,当我使用 JRE 1.7 运行应用程序时,它似乎完全忽略了 VALUE_FRACTIONALMETRICS_ON 是否有什么我做错了让 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);
    }
};

FRACTIONALMETRICS 对文本有最明显的视觉效果,所以我想要让它发挥作用。

这是我从使用 Java 6 的 IDE (Left) 运行应用程序和双击 Jar 文件其自身 (),它使用我的系统 JRE、Java 7。 (我还临时添加了红色边框以表明paint方法确实有效)

非常感谢任何帮助。

【问题讨论】:

    标签: java swing java-7 java-2d text-rendering


    【解决方案1】:

    通常不需要设置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);
        }
    }
    

    【讨论】:

    • 这似乎不起作用。我不想让它更厚,我想让它更锋利更干净。这确实使看起来像正确的图像。我想让它看起来像左边的图像,有点苗条
    • 我正在寻找字体的亚像素渲染。但这似乎只是 Java 6...
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多