在Java中缩放String以适应内部的矩形

时间:2012-03-06 18:00:07

标签: java transform scale graphics2d scaletransform

任何人都可以帮我找到一种方法缩放Java(Graphics2D)中的字符串/字符以完全适合给定大小的矩形(以便它从内部接触矩形)?< / p>

这是我到目前为止所做的:

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), 
                rect.getHeight() / (double) fm.getAscent());
FontRenderContext frc = image.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

问题我运行此代码是因为虽然字符串被缩放以适应大致的矩形大小,但它并不完全适合它,即。它不会从内部触及矩形边界(这就是我想要它做的!)。

是否有助于使用其他字体?我目前正在使用等宽字体。 或者,我是否必须采用不同的缩放方式?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我找到了一种方法来做我想做的事情,并认为我可以分享它:

我的主要问题是不同角色的高度,因此我使用轮廓的最大和最小Y坐标来计算其高度,而不是使用Font的上升。见下文。

String s = "S"; // always a single character!
Rectangle rect = getRect(); // defines the desired size and position
FontMetrics fm = g2d.getFontMetrics();
FontRenderContext frc = g2d.getFontRenderContext();
TextLayout tl = new TextLayout(s, g2d.getFont(), frc);
AffineTransform transform = new AffineTransform();
transform.setToTranslation(rect.getX(), rect.getY());
double scaleY = 
   rect.getHeight() / (double) (tl.getOutline(null).getBounds().getMaxY() 
                                - tl.getOutline(null).getBounds().getMinY());
transform.scale(rect.getWidth() / (double) fm.stringWidth(s), scaleY);
Shape shape = tl.getOutline(transform);
g2d.setClip(shape);
g2d.fill(shape.getBounds());

我希望能帮助有类似问题的人!