gpt4 book ai didi

java - 如何在java Graphics2d中使用TextLayout在短字符串上进行自动换行?

转载 作者:行者123 更新时间:2023-12-01 12:02:59 28 4
gpt4 key购买 nike

如何使用 java 中的 TextLayout 在下面的短标签字符串上有效地进行自动换行?

我的标签只有两三个字长一些例子:1. 充气温室D10;2.指挥控制中心A5;3.贾森·鲍里斯;

我想以尽可能像正方形的方式包裹单词,而不是一个长矩形。

所以我的问题是:如何将建筑物名称包装到第二行,而不是一长行?见下图:

overlapping names

有没有办法设置一行文本中包含的最大字符数并将剩余字符换行到第二行等等(需要考虑空格)?

例如,我想将名称“Residential Quarter D12”换行为三行。

  Residential
Quarter
D12

并将“Command and Control D16”换行为四行。

 Command 
and
Control
D16

如果 TextLayout 能够像普通 JLabel 一样理解 html 代码,那不是很好吗?然后事情就会变得简单:

       String label = "<html>" + "Inflatable" + "<br>" + "Greenhouse"  + "<br>" + "D10" + "</html>";

注意:每行不必是一个单词。但我想让它们在每一行“居中”

我所拥有的是以下方法,用于生成建筑物名称标签或人员的名字和姓氏的 BufferedImage。

    private BufferedImage createLabelImage(
String label, Font font, FontRenderContext fontRenderContext, Color labelColor,
Color labelOutlineColor) {

// Determine bounds.
TextLayout textLayout1 = new TextLayout(label, font, fontRenderContext);
Rectangle2D bounds1 = textLayout1.getBounds();

// Get label shape.
Shape labelShape = textLayout1.getOutline(null);

// Create buffered image for label.
int width = (int) (bounds1.getWidth() + bounds1.getX()) + 4;
int height = (int) (bounds1.getHeight()) + 4;
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

// Get graphics context from buffered image.
Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate(2D - bounds1.getX(), 2D - bounds1.getY());

// Draw label outline.
Stroke saveStroke = g2d.getStroke();
g2d.setColor(labelOutlineColor);
g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.draw(labelShape);
g2d.setStroke(saveStroke);

// Fill label
g2d.setColor(labelColor);
g2d.fill(labelShape);

// Dispose of image graphics context.
g2d.dispose();

return bufferedImage;
}

如您所见,该方法只能创建一个只有一行文本的 BufferedImage 形式的标签。

当我将这些 BufferedImage 标签叠加在 map 上时,它们看起来太长并且彼此重叠。

这就是为什么我需要使每个标签的形状尽可能像正方形。

最佳答案

让我尝试提出一种算法。

按空格分割标签以获得单词列表,并测量每个单词以获得数组

int[] wordWidths;
int minWidth=max(wordWidths);
int height=the row height const;
int minHeight=height;
int maxHeight=wordWidths.length*height;

int currentWidth=minWidht;
int currentHeight=maxHeight;

while(currentWidth<currentHeight || wordWidths.length>1) {
int mergedWidth=find minimal sum of neighbour words' widths
replace the 2 widths with the mergedWidth reducing the wordWidthssize
currentHeight=wordWidths.length*height;
}

或者你可以尝试依赖组件。我将定义一个 JTextArea 实例,在那里分配标签,并尝试使用换行将宽度减少 1 倍并测量宽度的首选高度。达到最佳大小后,您可以调用 theWrappedJtextArea.printAll(g) 将其绘制在 BufferedImage 的 Graphics 上。

关于java - 如何在java Graphics2d中使用TextLayout在短字符串上进行自动换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862193/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com