gpt4 book ai didi

java - Java 1.7 (Windows) 中的文本抗锯齿失效

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:57 24 4
gpt4 key购买 nike

对于 Java 1.7 (Windows) 的 Swing 组件,文本的抗锯齿呈现提示似乎已损坏。设置 KEY_ANTIALIASING 和/或 KEY_TEXT_ANTIALIASING 不再影响 JLabelJEditorPane 等的显示 - 但实际上我的项目需要不同的设置。

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

Left side run with Java 1.6, right side with Java 1.7

左侧是 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.aatextawt.useSystemAAFontSettings 无效。也没有更改外观

最佳答案

this answer 中找到解决方案.使用以下内容更新问题中的代码:

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);
...
}

在 Java 1.7 Windows 上测试。请注意,最近(2015 年 2 月)的 Windows 更新如 kb3013455许多系统上的字体抗锯齿都已损坏。

关于java - Java 1.7 (Windows) 中的文本抗锯齿失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com