如何在OS X的Swing中启用LCD子像素的抗锯齿功能? [英] How to enable LCD subpixel antialiasing in Swing on OS X?

查看:151
本文介绍了如何在OS X的Swing中启用LCD子像素的抗锯齿功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我被要求查找Swing中的旋钮,以使文本尽可能清晰易读.在OS X的Java 1.7+上的Swing应用程序中,是否有任何方法可以启用亚像素文本抗锯齿功能? Java中还有其他设置可以使文本可读吗?

I’ve been asked to look up the knobs in Swing to make text as legible as possible for reading. Is there any way to enable subpixel text antialiasing in a Swing application on Java 1.7+ on OS X? Are there any other settings in Java for making text readable?

观察:

  • 在OS X上的Java 1.7上,无论我做什么,所有文本均为灰色.
  • 即使子像素渲染不起作用,RenderingHints.VALUE_TEXT_ANTIALIAS_ON也会比RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB暗.为什么?
  • 默认情况下,Mac上的JComponent使用RenderingHints.VALUE_TEXT_ANTIALIAS_ON(深灰色抗锯齿)呈现.
  • 在Java 1.6上,-Dapple.awt.graphics.UseQuartz=true确实启用了LCD抗锯齿功能,但是该设置对Oracle Java 1.7无效.
  • 在Linux上,所有子像素抗锯齿提示都能正常工作,并且JComponent默认使用HRGB抗锯齿.
  • On Java 1.7 on OS X, no matter what I do, all text is gray.
  • Even when subpixel rendering doesn’t work, RenderingHints.VALUE_TEXT_ANTIALIAS_ON is darker than RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB. Why?
  • By default, a JComponent on the Mac is rendered with RenderingHints.VALUE_TEXT_ANTIALIAS_ON (dark gray antialiasing).
  • On Java 1.6, -Dapple.awt.graphics.UseQuartz=true does enable LCD antialiasing, but that setting has no effect on Oracle Java 1.7.
  • On Linux, all subpixel antialias hints work properly, and a JComponent uses HRGB antialiasing by default.

相同的屏幕截图为300%

这是我使用的代码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;

import sun.swing.SwingUtilities2;


public class TextAntialiasDemo {
    public static JLabel createJlabel(String name, final Object textAntialiasing) {
        JLabel label = new JLabel("ABCDEabcde text_antialiasing=" + name) {
            private static final long serialVersionUID = 1L;
            @Override public void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D)g.create();
                g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, textAntialiasing);
                super.paintComponent(g2);
            }
        };

        // Tell the JComponent to use the Graphics2d's text rendering hint
        // instead of the Toolkit default.
        label.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, null);
        // To make all new JComponents use Graphics2d's rendering hint, do this:
        // UIManager.getDefaults().remove(SwingUtilities2.AA_TEXT_PROPERTY_KEY);

        return label;
    }
    public static void main(String[] argv) {
        System.out.format("Look and feel: %s%n", UIManager.getLookAndFeel());
        JFrame jframe = new JFrame();
        if (argv.length > 0)
            jframe.setTitle(argv[0]);
        jframe.getContentPane().setLayout(new BoxLayout(jframe.getContentPane(), BoxLayout.PAGE_AXIS));
        jframe.add(new JLabel("ABCDEabcde"));
        jframe.add(createJlabel("default", RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT));
        jframe.add(createJlabel("off", RenderingHints.VALUE_TEXT_ANTIALIAS_OFF));
        jframe.add(createJlabel("on", RenderingHints.VALUE_TEXT_ANTIALIAS_ON));
        jframe.add(createJlabel("LCD_VRGB", RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB));
        jframe.add(createJlabel("LCD_VBGR", RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR));
        jframe.add(createJlabel("LCD_HBGR", RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR));
        jframe.add(createJlabel("LCD_HRGB", RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB));
        jframe.pack();
        jframe.setVisible(true);
    }
}

推荐答案

OpenJDK 9 b70中的OSX现在可以使用正确的亚像素AA字体渲染: https://jdk9.java.net/download/.如果您的表面是半透明的,则不可用.我已经写了关于如何启用它的文章,例如.用于在我的博客上使用netbeans; http://www.nothome.com/2015/07/subpixel-font-rendering-with-netbeans.html 或仅使用以下命令进行构建和修补:

Proper subpixel AA font rendering is now available for OSX in OpenJDK 9 b70: https://jdk9.java.net/download/. It's not available if your surfaces are translucent though. I've written up on how to enable that, eg. for use with netbeans on my blog; http://www.nothome.com/2015/07/subpixel-font-rendering-with-netbeans.html or simply build and patch using:

hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9
cd ./jdk9
bash ./get_source.sh 
cd jdk
curl http://cr.openjdk.java.net/~bae/8087201/9/webrev.00/jdk.patch | patch --dry-run -p1
curl https://gist.githubusercontent.com/iampivot/5677ccc024afe115d4bc/raw/f7b9acb1c6f356efa26f5772075a32dc899cd8ab/gistfile1.txt | patch -p0 
cd ..
sh ./configure --disable-warnings-as-errors
make all

这篇关于如何在OS X的Swing中启用LCD子像素的抗锯齿功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆