【发布时间】:2013-09-12 12:42:00
【问题描述】:
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 的呈现方式都相同(带有小数度量的除外)。
您知道如何让抗锯齿提示影响 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);
}
}
编辑:系统属性swing.aatext 和awt.useSystemAAFontSettings 无效。也没有更改Look and Feel。
【问题讨论】:
-
你能用另一个 L&F 试试同样的代码吗?
-
好主意。 Nimbus、Metal、Windows 和 Substance 的结果相同。
标签: java swing java-2d antialiasing