首页 > 解决方案 > Java 2D - 垂直居中文本

问题描述

我面临的问题是,我从字体度量对象获得的下降似乎是不正确的。这仅在非常大的字体上很明显。我已经尝试使用FontMetrics#getDescent-method 和FontMetrics#getStringBounds-Method 然后我使用heighty手动确定下降。虽然两者给出的结果略有不同,但都是不正确的。为预定义的字符集获取正确基线的最正确方法是什么?在我的情况下,它是 characters 0-9。这些都应该具有相同的基线,因此很容易居中。所以至少我的假设。

这是一个展示问题的示例:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIManager;


public class Draw
{
  public static void main( String[] args )
  {
    JFrame frame = new JFrame();
    frame.add( new X() );
    frame.pack();
    frame.setSize( 150, 300 );
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );
  }

  private static class X extends JComponent
  {
    private final Font xFont;

    public X()
    {
      xFont = UIManager.getFont( "Label.font" ).deriveFont( 40.0f );
    }

    @Override
    public void paint( Graphics g )
    {
      g.setColor( Color.YELLOW );
      g.fillRect( 0, 0, getWidth(), getHeight() );

      g.setColor( Color.BLACK );
      g.drawLine( 0, getHeight() / 2, getWidth() - 1, getHeight() / 2 );

      g.setFont( xFont );
      g.drawString( "X", getWidth() / 2, getHeight() / 2 + g.getFontMetrics().getDescent() );
    }
  }
}

在此处输入图像描述

黑线代表组件的中间。的垂直中心X应与线对齐。

标签: javaswinggraphicsfontsjava-2d

解决方案


以下似乎适用于大字体。调整是从 the中减去 theleading和the并除以二。如果您不包括前导,则似乎大字体的文本会漂移。在此示例中,字体大小为. 对于较小的字体,这可能不是问题。descentascent300

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawLine(0, getHeight() / 2, getWidth(),
            getHeight() / 2);
    g.setFont(xFont);
    String s = "X";
    FontMetrics fm = g.getFontMetrics();
    int swidth = fm.stringWidth(s);

    int ctrx = getWidth() / 2;
    int ctry = getHeight() / 2;

    int mheight = fm.getAscent() - fm.getDescent() - fm.getLeading();

    g.drawString(s, ctrx - swidth/2, ctry + mheight/2);
}

在此处输入图像描述


推荐阅读