- PR -

Javaでフォントの大きさ

1
投稿者投稿内容
会議室デビュー日: 2003/10/07
投稿数: 9
お住まい・勤務地: 神戸
投稿日時: 2004-07-01 11:35
こんにちは。
JavaでApplet上にフォントを表示させることをしていたのですが、ちょっと
疑問があがりました。
Javaが扱えるフォントはTrueType(とOpenType)のようなので、フォントの大きさを
ユーザーが任意に変更できるものだと思っております。実際AdobeのIllustratorや
ベンダのペイントツールなどは人の大きさに変更できます。
ですがJavaのAppletでその確認をしたところ、ある特定のスタイル(BOLD)の場合、
ある一定の大きさを超えるとフォントのアウトラインが崩れてしまいます。
「ある一定の大きさ」はフォントファミリー名ごとに大きさが違うので
一概には言えません。

以下にそのときに実行したJavaAppletのコードを乗せます。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/**
*<APPLET CODE="FontTest2.class" width="600" height="680">
*
*/
import java.applet.*;
import java.awt.*;
import java.io.*;

public class FontTest2 extends Applet {
int fontsize;

public void init() {
TextField tf = new TextField(5);
add( tf );
}

public boolean action( Event e, Object o ) {
fontsize = Integer.valueOf((String)o).intValue();
repaint();
return true;
}

public void paint( Graphics g ) {
Graphics2D g2 = (Graphics2D)g;
while( fontsize > 0 ) {
try {
Font font = new Font( "MS ゴシック",
Font.BOLD, fontsize );
g.setFont( font );
g.drawString( "あ="+fontsize, 50, fontsize );
break;
} catch( Exception ex ) {
System.out.println( "--Exception--" );
}
--fontsize;
}
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
例)
「MSゴシック」で「521pt」までは表示可能、「522pt」からはアウトラインが崩れる
「MS明朝」で「532pt」までは表示可能、「533pt」からはアウトラインが崩れる


このアウトラインが崩れるのはJavaの仕様上そうなってしまうものなのでしょうか?
また、これを回避して、任意の大きさに表示させることが可能なのでしょうか?

よろしくお願いします



会議室デビュー日: 2003/10/07
投稿数: 9
お住まい・勤務地: 神戸
投稿日時: 2004-07-09 15:14
自己レスです。
回避策はフォントのサイズを上げることではなく、AffineTransformクラスを利用して
スケール(拡大縮小)すれば問題ないのでは?と思いました。
いかにそのソースを記述します。

>>>>>>>>>>>>>>>>>>>>>>>
/**
*<APPLET CODE="FontTest2.class" width="600" height="680">
*
*/
import java.applet.*;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.*;

import javax.swing.JScrollPane;

public class FontTest2 extends Applet {
int fontsize;
JScrollPane scroll;


public void init() {
TextField tf = new TextField(5);
add( tf );
this.setBackground(Color.black);
}

public boolean action( Event e, Object o ) {
fontsize = Integer.valueOf((String)o).intValue();
repaint();
return true;
}

public void paint( Graphics g ) {
Graphics2D g2 = (Graphics2D)g;
while( fontsize > 0 ) {
try {
Font font = new Font( "MS ゴシック",
Font.BOLD, 1 );

AffineTransform afFont = new AffineTransform();
afFont.setToScale(fontsize,fontsize);
g2.setColor(Color.WHITE);
g2.setFont( font );

FontMetrics met = g2.getFontMetrics(font);
int i = met.getMaxAdvance();

FontRenderContext ctx = g2.getFontRenderContext();
//
g2.setTransform(afFont);
g2.drawString( "あ", 1, 1 );
break;
} catch( Exception ex ) {
System.out.println( "--Exception--" );
}
--fontsize;
}
//scroll = new JScrollPane(this.getComponent(1));
}
}

>>>>>>>>>>>>>>>>>>>>>>>

ただ、AffineTransformを使うと、どうしても表示場所が変わってしまうんです。
例えばテキストボックスに「10」を入れるときと「100」を入れるときの位置が
違うんです。これに対しての回避策とかありますでしょうか?


1

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