当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Java中获得真正的字符串高度?》经验,为你挑选了3个好方法。

我正在使用FontMetrics.getHeight()获取字符串的高度,但它给了我一个错误的值,切断了字符串字符的下降.我可以使用更好的功能吗?



1> ranieribt..:

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

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();
            }
        });
    }
}

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

结果:

结果截图.



2> Joachim Saue..:

是什么让你认为它返回错误的价值?你对它返回的预期与规范不符的可能性要大得多.请注意,如果Font中的某些字形超过或低于这些值,则完全正常.

getMaxDescent()并且getMaxAscent()应该告诉您Font中任何字形的那些字段的绝对最大值.

如果您想知道特定String的指标,那么您肯定想要调用getLineMetrics().



3> Bombe..:

FontMetrics.getAscent()和FontMetrics.getDescent()可能做的伎俩.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有