FontMetrics返回错误的高度

时间:2016-04-07 13:18:11

标签: java swing java-2d

我希望在面板上获得字符串的确切高度(以像素为单位)。所以我编写了一个绘制字符串的程序,然后围绕它绘制一个矩形。

使用 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 个答案:

答案 0 :(得分:3)

关于你的矩形,你必须考虑字体的下降(它在线下的距离)

Fragment

另请注意,字体高度通常会考虑某种行间距。在这种情况下,fm.getDescent()+ fm.getAscent()= 68而fm.getHeight()= 70

答案 1 :(得分:2)

顶部的空间可以解释为你没有考虑下降(这让我回到了我最喜欢的方法之一:java 1.0:getMaxDecent)

否则,盒子看起来不错。我能提供的唯一其他建议是fm.getStringBounds对某些字体的效果比对其他字体的效果更好