私は問題があります。そこで東方言語を使用すると、アプリケーション インターフェイスの動作が大幅に遅くなります。特にJList、JCombobox、JTableなどのコンポーネントでそれを感じました。
テキスト内の少なくとも 1 つの文字がアラビア語またはペルシア語の場合、FontMetrics.stringWidth メソッドのパフォーマンスが非常に遅い (500 回以上) ことがわかりました。どのように私はそれがさまざまなスイングコンポーネントで一般的に使用されている方法であることを知っています.
このメソッドのパフォーマンスを向上させる方法はありますか?
問題を示すクラスの例を次に示します。
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class FontMetricsSpeedTest
{
public static void main( String args[] ) {
String persian="صصصصصصصصصصصصصصصصصصصصص";
String english="abcde()agjklj;lkjelwk";
FontMetrics fm=createFontMetrics(new Font("dialog",Font.PLAIN,12));
int size=50000;
long start=System.currentTimeMillis();
for(int i=0;i<size;i++)
{
fm.stringWidth(persian);
}
System.out.println("Calculation time for persian: "+(System.currentTimeMillis()-start)+" ms");
start=System.currentTimeMillis();
for(int i=0;i<size;i++)
{
fm.stringWidth(english);
}
System.out.println("Calculation time for english: "+(System.currentTimeMillis()-start)+" ms");
}
private static FontMetrics createFontMetrics(Font font)
{
BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics g = bi.getGraphics();
FontMetrics fm = g.getFontMetrics(font);
g.dispose();
bi = null;
return fm;
}
}
私にとっては、次の出力が得られます。
ペルシア語の計算時間: 5482 ミリ秒
英語の計算時間: 11 ms