2016-04-07 5 views
1

私のパネル上の文字列の正確な高さをピクセルで取得したいと考えています。だから私は、文字列を描画し、その周りに長方形を描くプログラムを書いた。 フォントメトリックスを使用してFontMetricsが正しくない高さを返します

は、私は私に外接矩形を取得するためにgetStringBounds方法を使用していました。それは間違って見えるしかし

enter image description here

私は完全に私のテキストを囲む長方形を期待していたが、そこにスペースが最上部にある(そして左のスペースのほんの少し、右)。なぜ私にこの結果を与えているのですか?ここで

は私のコードです:上部の

public class Test extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 

     Font font = new Font("Arial", Font.PLAIN, 60); 
     g.setFont(font); 

     FontMetrics fm = this.getFontMetrics(font); 

     String str = "100dhgt"; 
     Rectangle2D rect = fm.getStringBounds(str, g); 

     int x = 5; 
     int y = 100; 

     g.drawRect(x, y - (int)rect.getHeight(), (int)rect.getWidth(), (int)rect.getHeight()); 
     g.drawString(str, x, y); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 

     Test test = new Test(); 
     f.add(test); 
     f.setVisible(true); 
     f.setSize(400, 400); 
    } 

} 

答えて

2

で、あなたはフォントの下降を考慮する必要がないよりも、fm.getStringBoundsは、一部のフォントでうまく動作していることである(それは線の下にどこまである)

g.drawString(str, x, y - fm.getDescent()); 

また、フォントの高さは通常、ある種の行間を考慮しています。この場合、fm.getDescent()+ fm.getAscent()= 68、fm.getHeight()= 70のようになります。

2

スペースは、あなたが(1.0をJavaから戻って私のお気に入りの方法のいずれかに私を取る:getMaxDecent)の降下を考慮していないことで説明できる

それ以外の場合、このボックスはかなりよく見えます。私が提供できる唯一の他のアドバイスは、それはあなたの長方形に関しては、他

+0

また、TextLayoutを検討してみてください(http://stackoverflow.com/a/16014525/)。 230513)。 – trashgod

+0

境界線は、紙の上にテキストを書くようなものですか?つまり学校のように、あなたは行の下にgとyを書く必要がありました。 –

関連する問題