对于Swing组件Java1.7 (Windows)来说,文本的防混叠呈现提示似乎被破坏了。设置KEY_ANTIALIASING和/或KEY_TEXT_ANTIALIASING不再影响JLabel、JEditorPane等的显示,但实际上我需要在项目中设置不同的设置。
您可以在此屏幕截图中比较Java 1.6 (jdk1.6.0_45)和Java 1.7 (jdk1.7.0_40)中的不同行为,这些行为由下面的测试程序生成:

左边是Java1.6,右边是Java1.7。第一列是用Graphics2D.drawString绘制的,第二列是用JLabel绘制的。在Java1.6中,呈现提示会影响JLabel显示,而在Java1.7中,所有JLabels呈现相同(除了具有分数度量的显示)。
您知道如何让抗别名提示影响Java1.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。
发布于 2015-02-18 13:25:45
在这个答案中找到了一个解决方案。用以下方式更新您问题中的代码:
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);
...
}在Java1.7Windows上进行测试。请注意,最近(2015年2月) kb3013455等Windows更新已经破坏了许多系统上的字体反混叠。
发布于 2013-09-16 19:36:15
首先,关于Swing组件行为的几点看法:
super.paintComponent()时调用的Swing组件的UI委托可以设置它想要的任何呈现提示--从外观和感觉上看,JLabel的UI委托似乎覆盖了您的MetalLookAndFeel,它的设计考虑到了这个用例。尽管如此,从JDK1.6(因此据我所知,1.7,但没有承诺),您可以通过undocumented (因此不受支持)桌面属性访问AWT和Swing使用的默认呈现提示。
(Map<RenderingHints.Key, Object>)(Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"));
这是一个方法。它所做的与你所追求的正好相反,因为它试图强制反走样。但是,操作该Map的内容或替换它,可能会在全局范围内更改反别名设置。
发布于 2015-02-18 12:19:39
我知道这是个古老的问题,但我遇到了同样的问题。
在调查之后,我发现如果将以下内容添加到main()方法中,代码将按预期的方式工作:
System.setProperty("awt.useSystemAAFontSettings","off");
System.setProperty("swing.aatext", "false");Java 7的默认值似乎从“off”改为“on”
https://stackoverflow.com/questions/18764585
复制相似问题