3

JavaのどのフォントAPIが正しい幅を返しますか? 現在使用している

font.getStringBounds( "the string", frc ).getWidth();

これにより、画像と表示に正しい値が返されます。しかし、Java SE 6 での印刷では間違っています。Java 7 では、すべて正しいです。違いは非常に小さいです。ただし、行末の「i」が 1 つ失われています。まったく同じ値を印刷して受け取ります。しかし、テキストは、印刷グラフィック上により多くのスペースを必要とします。

アンチエイリアスと分数メトリックを使用します。

私は異なるAPIがあることを知っています。しかし、推奨される API は何ですか?

4

3 に答える 3

0

TextLayoutおそらく最も用途の広いアプローチです。ここでの質問と回答の中に、いくつかの関連する例があります。

Java2Dグラフィックスはアンチエイリアス処理されています。

テキストがJTextAreaで取る行数(および各行の列数)を計算するにはどうすればよいですか?

省略記号を使用して文字列を切り捨てる理想的な方法。

于 2011-05-27T15:37:45.937 に答える
0

Java は、以下に示すように、FontRenderContext を拡張して FractionalMetricsHint をオンにするために必要なものを、画面にレンダリングしようとしていると想定しているため、デフォルトですべてのフォント メトリックを丸めます。次に、それを使用してフォント レンダー コンテキストを渡します。

import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;

public class MyFontRenderContext extends FontRenderContext {

public MyFontRenderContext()
{

}
@Override
public AffineTransform getTransform()
{
    return new AffineTransform();
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#usesFractionalMetrics()
 */
@Override
public boolean usesFractionalMetrics()
{
    return true;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#getFractionalMetricsHint()
 */
@Override
public Object getFractionalMetricsHint()
{
    // TODO Auto-generated method stub
    return RenderingHints.VALUE_FRACTIONALMETRICS_ON;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#getAntiAliasingHint()
 */
@Override
public Object getAntiAliasingHint()
{
    return RenderingHints.VALUE_ANTIALIAS_ON;
}

/* (non-Javadoc)
 * @see java.awt.font.FontRenderContext#isAntiAliased()
 */
@Override
public boolean isAntiAliased()
{
    return true;
}

}

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class FontMetricsReader
{
public static void main(String[] args)
{
    Font f = new Font("Frutiger55Roman", java.awt.Font.PLAIN, 6);
    BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    FontMetrics metrics = g.getFontMetrics(f);

    String str = "The quick brown fox jumps over the lazy dog";

    System.out.println("Rounded text width = " + metrics.stringWidth(str));

    System.out.println("Accurate text width = " + f.getStringBounds(str, new MyFontRenderContext()).getWidth());
}

}
于 2012-12-18T18:15:33.690 に答える