Java 1.7(Windows)中破坏的文本抗锯齿

Java 1.7(Windows)中破坏的文本抗锯齿,java,swing,java-2d,antialiasing,Java,Swing,Java 2d,Antialiasing,对于Swing组件Java 1.7(Windows),文本的抗锯齿呈现提示似乎已中断。设置KEY\u抗锯齿和/或KEY\u TEXT\u抗锯齿不再影响JLabel、JEditorPane等的显示-但实际上我需要在项目中进行不同的设置 您可以在此屏幕截图中比较Java 1.6(jdk1.6.0_45)和Java 1.7(jdk1.7.0_40)中的不同行为,该屏幕截图由以下测试程序生成: 左边是Java1.6,右边是Java1.7。第一列用图形2d.drawString绘制,第二列用JLabel

对于Swing组件Java 1.7(Windows),文本的抗锯齿呈现提示似乎已中断。设置
KEY\u抗锯齿
和/或
KEY\u TEXT\u抗锯齿
不再影响
JLabel
JEditorPane
等的显示-但实际上我需要在项目中进行不同的设置

您可以在此屏幕截图中比较
Java 1.6
(jdk1.6.0_45)和
Java 1.7
(jdk1.7.0_40)中的不同行为,该屏幕截图由以下测试程序生成:

左边是Java1.6,右边是Java1.7。第一列用
图形2d.drawString
绘制,第二列用
JLabel
绘制。在Java 1.6中,呈现提示会影响JLabel显示,而在Java 1.7中,所有JLabel都呈现相同的显示(具有分数度量的除外)

您知道如何让抗锯齿提示影响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);
    }
}
import java.awt.*;
导入java.util.*;
导入javax.swing.*;
公共类AntialiasMain扩展JFrame{
公共抗锯齿代码(){
JPanel面板=新JPanel(新网格布局(0,1));
添加(新的抗锯齿标签(“默认”,null));
HashMap提示=新建HashMap();
提示.put(renderinghits.KEY\u抗锯齿,renderinghits.VALUE\u抗锯齿\u OFF);
添加(新的抗锯齿标签(“AA关闭”,提示));
提示=新的HashMap();
put(renderinghits.KEY\u抗锯齿,renderinghits.VALUE\u抗锯齿开);
添加(新的抗锯齿标签(“AA on”,提示));
提示=新的HashMap();
提示.put(renderinghits.KEY\u TEXT\u抗锯齿,renderinghits.VALUE\u TEXT\u抗锯齿\u OFF);
添加(新的抗锯齿标签(“TextAA off”,提示));
提示=新的HashMap();
提示.put(RenderingHints.KEY\u TEXT\u抗锯齿,RenderingHints.VALUE\u TEXT\u抗锯齿\u ON);
添加(新的抗锯齿标签(“TextAA on”,提示));
提示=新的HashMap();
put(renderinghits.KEY\u抗锯齿,renderinghits.VALUE\u抗锯齿开);
提示.put(RenderingHints.KEY\u TEXT\u抗锯齿,RenderingHints.VALUE\u TEXT\u抗锯齿\u ON);
添加(新的抗锯齿标签(“AA+TextAA on”,提示));
提示=新的HashMap();
put(renderinghits.KEY\u抗锯齿,renderinghits.VALUE\u抗锯齿开);
提示.put(renderinghits.KEY_分数矩阵,renderinghits.VALUE_分数矩阵开);
添加(新的抗锯齿标签(“AA+FractMetr打开”,提示));
提示=新的HashMap();
put(renderinghits.KEY\u抗锯齿,renderinghits.VALUE\u抗锯齿开);
put(renderinghits.KEY\u TEXT\u抗锯齿,renderinghits.VALUE\u TEXT\u抗锯齿\u LCD\u HRGB);
添加(新的抗锯齿标签(“AA+TextLCD打开”,提示));
提示=新的HashMap();
put(renderinghits.KEY\u TEXT\u抗锯齿,renderinghits.VALUE\u TEXT\u抗锯齿\u LCD\u HRGB);
添加(新的抗锯齿标签(“TextLCD打开”,提示));
getContentPane().add(面板);
}
类AntialiasLabel扩展了JLabel{
私有最终HashMap提示;
私有最终字符串标签;
private static final String PALYNDROME=“敏捷的棕色狐狸跳过了懒狗”;
公共抗锯齿标签(字符串标签、哈希映射提示){
超级(孢粉场);
设置前景(颜色为黑色);
setboorder(BorderFactory.createEmptyByOrder(10150,10,10));
this.label=标签;
this.hints=提示;
}
@凌驾
受保护组件(图形g){
图形2d g2=(图形2d)g;
if(提示!=null)
g2.设置渲染提示(提示);
g2.抽绳(“设置:”+label,2,getHeight()/2+5);
超级组件(g2);
}
}
公共静态void main(最终字符串[]args){
JFrame f=新的抗锯齿主();
f、 setDefaultCloseOperation(在关闭时处理);
f、 包装();
f、 setVisible(真);
}
}

Edit:系统属性
swing.aatext
awt.useSystemAAFontSettings
无效。也没有改变
外观

首先,关于Swing组件行为的几点:

  • 调用
    super.paintComponent()
    时正在调用的Swing组件的UI委托可以设置它想要的任何呈现提示-看起来JLabel的UI委托正在覆盖您的UI委托
  • 如果您不想使用抗锯齿(即,您使用的是remote X或类似产品),您可能应该使用
    MetalLookAndFeel
    ,它是在考虑该用例的情况下设计的
  • 不能保证任何组件的UI委托不会覆盖您为呈现提示而设置的任何内容,即您看到的行为完全合法
也就是说,从JDK1.6开始(据我所知,是1.7,但没有承诺),您可以通过未记录的(因此不受支持)桌面属性访问AWT和Swing使用的默认呈现提示

(Map)(Toolkit.getDefaultToolkit().getDesktopProperty(“awt.font.desktophits”)


这是一本书。它的作用与您所追求的相反,因为它试图强制启用抗锯齿。但是,操纵或替换
映射的内容可能会全局更改抗锯齿设置。

我知道这是一个古老的问题,但我遇到了同样的问题

经过调查,我发现如果将以下内容添加到main()方法中,代码将按预期工作:

System.setProperty("awt.useSystemAAFontSettings","off");
System.setProperty("swing.aatext", "false");
Java 7的默认设置似乎从两个属性“off”都变为“on”

在中找到了解决方案。使用以下内容更新问题中的代码:

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);
    ...
}
private静态最终对象AA\u TEXT\u PROP=getAaTextPrope