首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中获得真实的字符串高度?

如何在Java中获得真实的字符串高度?
EN

Stack Overflow用户
提问于 2008-12-15 13:02:22
回答 5查看 30.3K关注 0票数 19

我使用FontMetrics.getHeight()来获取字符串的高度,但是它给出了一个错误的值,切断了字符串字符的后缀。有没有更好的功能可以使用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-19 20:53:12

下面的getStringBounds()方法基于当前Graphics2D字体的GlyphVector,它非常适用于一行文本字符串:

代码语言:javascript
复制
public class StringBoundsPanel extends JPanel
{
    public StringBoundsPanel()
    {
        setBackground(Color.white);
        setPreferredSize(new Dimension(400, 247));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);

        // must be called before getStringBounds()
        g2.setFont(getDesiredFont());

        String str = "My Text";
        float x = 140, y = 128;

        Rectangle bounds = getStringBounds(g2, str, x, y);

        g2.setColor(Color.red);
        g2.drawString(str, x, y);

        g2.setColor(Color.blue);
        g2.draw(bounds);

        g2.dispose();
    }

    private Rectangle getStringBounds(Graphics2D g2, String str,
                                      float x, float y)
    {
        FontRenderContext frc = g2.getFontRenderContext();
        GlyphVector gv = g2.getFont().createGlyphVector(frc, str);
        return gv.getPixelBounds(null, x, y);
    }

    private Font getDesiredFont()
    {
        return new Font(Font.SANS_SERIF, Font.BOLD, 28);
    }

    private void startUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception
    {
        final StringBoundsPanel tb = new StringBoundsPanel();

        SwingUtilities.invokeAndWait(new Runnable()
        {
            public void run()
            {
                tb.startUI();
            }
        });
    }
}

请注意,为了清楚起见,我省略了导入。

结果是:

票数 23
EN

Stack Overflow用户

发布于 2008-12-15 13:07:08

是什么让你认为它返回了错误的值?更有可能的是,您对它返回的内容的期望与规范不符。请注意,如果字体中的某些字形超过或低于这些值,则完全没有问题。

对于字体中的任何字形,getMaxDescent()getMaxAscent()应该会告诉您这些字段的绝对最大值。

如果您想知道特定字符串的度量标准,那么您肯定希望调用getLineMetrics()

票数 13
EN

Stack Overflow用户

发布于 2008-12-15 13:05:40

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/368295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档