- PR -

ClearTypeフォントをSwingで使いたい (Windows環境)

1
投稿者投稿内容
Okayu3
会議室デビュー日: 2004/03/11
投稿数: 11
投稿日時: 2004-05-12 12:46
最近 WindowsXP で 大幅に 導入され、
それ以前のWindowsでも一部利用できていた
フォントを滑らかに表示する ClearType フォント。

これをSwing上で使うようにしたいと思って
いろいろ工夫したのですがスマートな方法が思いつきません。

とりあえず RenderingHints の KEY_TEXT_ANTIALIASINGを
ONにすればいいのは分かっているので、

コード:
public class JButtonAntiAlias extends JButton {
  public JButtonAntiAlias() {
  }
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    super.paint(g);
  }
}


のようにして コンポーネントの描画時に指定してやればいいのですが、
もっと 簡単にできないものかと思いまして、ご相談いたします。

  1. RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT の値を
    変更してやれば一発なのですが、この値が定義されている
    sun.awt.SunHint クラスを自分で書き換えるというような方法しか
    思いつきません。

  2. LookAndFeel の UIDefault を書き換えて、
    含まれている ComponentUI のpaintメソッドを書き換える
    という手もあるかと思いますが、膨大な手数になりそうです。

Swing.propertiesの書き換えなどで対処できたらベストなのですが...
何かいい手をお持ちの方、是非アドバイスください。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-05-13 02:52
Okayu3さん、こんにちは。

各々のコンポーネントの paintで AntiAliasを設定しなくとも、
階層(クラスの階層ではなく、コンテナの階層)の上位、
たとえば、それらのコンポーネントを含む JPanelとか、さらに
上の JFrameとかの paintで設定すれば、多くの場合うまく行く
と思われますがどうでしょう。
Okayu3
会議室デビュー日: 2004/03/11
投稿数: 11
投稿日時: 2004-05-13 11:42
Kissinger さん、アドバイスありがとうございます。

Kissinger さん:
引用:

各々のコンポーネントの paintで AntiAliasを設定しなくとも、
階層(クラスの階層ではなく、コンテナの階層)の上位、
たとえば、それらのコンポーネントを含む JPanelとか、さらに
上の JFrameとかの paintで設定すれば、多くの場合うまく行く
と思われますがどうでしょう。

実験しましたが、残念ですが 上位コンテナで指定しても
RenderingHint は inheritされませんでした。
Graphics オブジェクトがそれぞれに作られているためと思われます。

サンプル:
コード:
import java.awt.*;
import javax.swing.*;
public class SampleAntiAliasFrame extends JFrame {
  boolean onlyContainer = true;

  class JLabelAA extends JLabel{
    public void paint(Graphics g) {
      if (!SampleAntiAliasFrame.this.onlyContainer) {
        antiAliasing(g);
      }
      super.paint(g);
    }
  }
  class JButtonAA extends JButton{
    public void paint(Graphics g) {
      if (!SampleAntiAliasFrame.this.onlyContainer) {
        antiAliasing(g);
      }
      super.paint(g);
    }
  }
  JLabel jLabel1 = new JLabelAA();
  JButton jButton1 = new JButtonAA();
//  Font clearTypedFont = new Font("HGPゴシックE",0,14);
  Font clearTypedFont = new Font("SansSerif",0,14);

  protected static void antiAliasing(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  }

  public void paint(Graphics g) {
    antiAliasing(g);
    super.paint(g);
  }

  public SampleAntiAliasFrame() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    SampleAntiAliasFrame frame = new SampleAntiAliasFrame();
    frame.setBounds(0,0,600,400);
    frame.setVisible(true);
  }

  private void jbInit() throws Exception {
    jButton1.setFont(clearTypedFont);
    jLabel1.setFont(clearTypedFont);
    jLabel1.setText("abcde 美しく表示?");
    jButton1.setText("abcde 美しく表示?");
    this.getContentPane().add(jLabel1,  BorderLayout.CENTER);
    this.getContentPane().add(jButton1, BorderLayout.NORTH);
  }
}

  • boolean onlyContainer で上位コンテナのみ AntiAliasingするかどうか
    切り替えます。
  • フォント は SansSerifでも違いを実感できますが、
    コメントアウトしてある "HGPゴシックE" フォントのほうが
    より はっきり違いが分かります。
    (このフォントは MS Officeについてくるものです)
  • jdk1.3.0 / j2sdk1.4.2 で動作確認しています。
1

スキルアップ/キャリアアップ(JOB@IT)