我被要求查看 Swing 中的旋钮,以使文本尽可能清晰易读。有没有办法在 OS X 上的 Java 1.7+ 上的 Swing 应用程序中启用亚像素文本抗锯齿?Java中是否有任何其他设置可以使文本可读?
观察:
- 在 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 抗锯齿。
这是我使用的代码:
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);
}
}