sin*_*a72 6 java swing java-2d antialiasing
对于Swing组件Java 1.7(Windows),对文本的抗锯齿渲染提示似乎已经破坏.设置 KEY_ANTIALIASING和/或KEY_TEXT_ANTIALIASING已不影响显示器JLabel,JEditorPane等-但实际上我需要在我的项目不同的设置.
您可以在此截图中比较Java 1.6(jdk1.6.0_45)和Java 1.7(jdk1.7.0_40)中的不同行为,使用下面的测试程序生成:

左边是Java 1.6,右边是Java 1.7.第一列是涂上的Graphics2D.drawString,第二列是涂上的JLabel.在Java 1.6中,渲染提示会影响JLabel显示,而在Java 1.7中,所有JLabel都会呈现相同的内容(除了具有小数度量标准的JLabel).
你知道我如何让抗锯齿提示影响Java 1.7中的Swing组件吗?
测试程序:
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class AntialiasMain extends JFrame {
public AntialiasMain() {
JPanel panel = new JPanel(new GridLayout(0, 1));
panel.add(new AntialiasLabel("default", null));
HashMap<Key, Object> hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
panel.add(new AntialiasLabel("AA off", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
panel.add(new AntialiasLabel("AA on", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
panel.add(new AntialiasLabel("TextAA off", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
panel.add(new AntialiasLabel("TextAA on", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
panel.add(new AntialiasLabel("AA+TextAA on", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
panel.add(new AntialiasLabel("AA+FracMetr on", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
panel.add(new AntialiasLabel("AA+TextLCD on", hints));
hints = new HashMap<Key, Object>();
hints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
panel.add(new AntialiasLabel("TextLCD on", hints));
getContentPane().add(panel);
}
class AntialiasLabel extends JLabel {
private final HashMap<Key, Object> hints;
private final String label;
private static final String PALYNDROME = "The quick brown fox jumped over the lazy dog";
public AntialiasLabel(String label, HashMap<Key, Object> hints) {
super(PALYNDROME);
setForeground(Color.BLACK);
setBorder(BorderFactory.createEmptyBorder(10, 150, 10, 10));
this.label = label;
this.hints = hints;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (hints != null)
g2.setRenderingHints(hints);
g2.drawString("Setting: " + label, 2, getHeight() / 2 + 5);
super.paintComponent(g2);
}
}
public static void main(final String[] args) {
JFrame f = new AntialiasMain();
f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:系统属性swing.aatext并awt.useSystemAAFontSettings没有任何效果.也没有改变Look and Feel.
在此答案中找到了解决方案。将问题中的代码更新为:
private static final Object AA_TEXT_PROP = getAaTextProperty();
public static Object getAaTextProperty() {
Object aatext = null;
try {
Class<?> c = Class.forName("sun.swing.SwingUtilities2");
Field f = c.getField("AA_TEXT_PROPERTY_KEY");
aatext = f.get(null);
} catch (Exception e) {
e.printStackTrace();
}
return aatext;
}
...
public AntialiasLabel(String label, HashMap<Key, Object> hints) {
super(PALYNDROME);
putClientProperty(AA_TEXT_PROP, null);
...
}
Run Code Online (Sandbox Code Playgroud)
在 Java 1.7 Windows 上测试。请注意,最近(2015 年 2 月)的 Windows 更新(例如kb3013455)已破坏许多系统上的字体抗锯齿功能。