首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java1.7 (Windows)中的文本反走样破坏

Java1.7 (Windows)中的文本反走样破坏
EN

Stack Overflow用户
提问于 2013-09-12 12:42:00
回答 3查看 2.1K关注 0票数 6

对于Swing组件Java1.7 (Windows)来说,文本的防混叠呈现提示似乎被破坏了。设置KEY_ANTIALIASING和/或KEY_TEXT_ANTIALIASING不再影响JLabelJEditorPane等的显示,但实际上我需要在项目中设置不同的设置。

您可以在此屏幕截图中比较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组件吗?

测试程序:

代码语言:javascript
复制
    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.aatextawt.useSystemAAFontSettings没有影响。也没有改变Look and Feel

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-18 13:25:45

这个答案中找到了一个解决方案。用以下方式更新您问题中的代码:

代码语言:javascript
复制
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更新已经破坏了许多系统上的字体反混叠。

票数 4
EN

Stack Overflow用户

发布于 2013-09-16 19:36:15

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

  • 在调用super.paintComponent()时调用的Swing组件的UI委托可以设置它想要的任何呈现提示--从外观和感觉上看,JLabel的UI委托似乎覆盖了您的
  • 如果您不想使用反别名(也就是说,您使用的是远程X或类似的),那么您可能应该使用MetalLookAndFeel,它的设计考虑到了这个用例。
  • 不能保证任何组件的UI委托都不会覆盖为呈现提示而设置的任何内容,也就是说,您所看到的行为是完全合法的。

尽管如此,从JDK1.6(因此据我所知,1.7,但没有承诺),您可以通过undocumented (因此不受支持)桌面属性访问AWT和Swing使用的默认呈现提示。

(Map<RenderingHints.Key, Object>)(Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"));

这是一个方法。它所做的与你所追求的正好相反,因为它试图强制反走样。但是,操作该Map的内容或替换它,可能会在全局范围内更改反别名设置。

票数 1
EN

Stack Overflow用户

发布于 2015-02-18 12:19:39

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

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

代码语言:javascript
复制
System.setProperty("awt.useSystemAAFontSettings","off");
System.setProperty("swing.aatext", "false");

Java 7的默认值似乎从“off”改为“on”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18764585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档