java - Java 2D - 垂直居中文本
问题描述
我面临的问题是,我从字体度量对象获得的下降似乎是不正确的。这仅在非常大的字体上很明显。我已经尝试使用FontMetrics#getDescent
-method 和FontMetrics#getStringBounds
-Method 然后我使用height
并y
手动确定下降。虽然两者给出的结果略有不同,但都是不正确的。为预定义的字符集获取正确基线的最正确方法是什么?在我的情况下,它是 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
应与线对齐。
解决方案
以下似乎适用于大字体。调整是从 the中减去 theleading
和the并除以二。如果您不包括前导,则似乎大字体的文本会漂移。在此示例中,字体大小为. 对于较小的字体,这可能不是问题。descent
ascent
300
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);
}
推荐阅读
- python - 如何显示 x 和 y 轴图
- php - Codeigniter 没有被渲染
- c - SDL_WINDOWEVENT_RESIZED 与 SDL_WINDOWEVENT_SIZE_CHANGED
- c# - 移动应用的 TCP 通信和 Rest API 的结合
- android - 身份验证和实时数据库中的 Android Firebase 相关错误
- c++ - 从 svc 触发 pendsv || 手动触发 systick 皮质 m4
- java - @ComponentScan 在 org.springframework.context.annotation 包中不存在
- angular - 两个日期之间的 TypeScript 差异
- java - 如何制作私人包裹?
- apache - 一台主机上的多个域 https 和 http