Java drawString限制?

时间:2015-02-05 16:09:45

标签: java string

我想绘制一个具有特定尺寸/边界的字符串。

我知道如何绘制字符串,我知道如何测量字符串,这是一个经常被问到的问题。我也知道Java在各种操作系统上的不同dpi处理,我知道Java根据你绘制的Graphics2D对象的尺寸调整字符串的大小。

我想做点什么:

graphics2d.drawString("Hello World", width, height);

(当然上面的例子会将文本呈现在位置宽度和高度上)。

有没有一种有效的方法来做我想要的事情?

我也找到了解决问题的非常低效解决方案:

  1. 创建目标屏幕/窗口大小的图像
  2. 测量此图像图形对象中的文字
  3. 渲染文字
  4. 创建文本区域的子图像
  5. 感谢您的时间。

2 个答案:

答案 0 :(得分:0)

Java JLabel通过调用ui.getPreferredSize(this)来确定其首选大小。 通常,标签的ui是BasicLabelUI,它在内部使用java.awt.FontMetrics来计算绘制字符串所需的宽度。

由于FontMetrics的界面非常简单,你应该使用它,而不是试图双重渲染字符串。

答案 1 :(得分:0)

在社区的帮助下,我能够编写这种方法。我添加了一些评论以明确(呃)而不发布全班。我有兴趣,我可以发表全班。

/**
 * Renders a string to a translucent image and returns it
 * @param string the text, like "Hello World"
 * @param size an enum, like SMALL, MIDDLE, LARGE
 * @param graphics the graphics of the scene, used for measuring the string-dimension
 * @return
 */
public BufferedImage renderTextToImage(String string, Size size, Color color, Graphics graphics) {
    Vector2 imageDimension = this.getFontDimensionPixels(string, size, graphics); // helper which measures string using fontmetrics
    BufferedImage returnImage = new BufferedImage(
            Max.maxInt((int)imageDimension.getX(), 1), // Max.maxInt() is a little helper to get the bigger out of two values
            Max.maxInt((int)imageDimension.getY(), 1),
            Transparency.TRANSLUCENT);
    Graphics2D returnGraphics = returnImage.createGraphics();
    returnGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    returnGraphics.setFont(this.getFont(size));
    returnGraphics.setColor(color);
    returnGraphics.drawString(string, 0, returnImage.getHeight() * 0.8f);
    returnGraphics.dispose();
    return returnImage;
}