Swing コンポーネント Java 1.7 (Windows) では、テキストのアンチエイリアシング レンダリング ヒントが壊れているようです。KEY_ANTIALIASING
and/or を設定 しても、 、 など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
、2 番目の列は で塗りつぶされ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
。