我想绘制一个具有特定尺寸/边界的字符串。
我知道如何绘制字符串,我知道如何测量字符串,这是一个经常被问到的问题。我也知道Java在各种操作系统上的不同dpi处理,我知道Java根据你绘制的Graphics2D对象的尺寸调整字符串的大小。
我想做点什么:
graphics2d.drawString("Hello World", width, height);
(当然上面的例子会将文本呈现在位置宽度和高度上)。
有没有一种有效的方法来做我想要的事情?
我也找到了解决问题的非常低效解决方案:
感谢您的时间。
答案 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;
}