From 904855ee3ee627d3734f1a0ab219afe4a5c9ee41 Mon Sep 17 00:00:00 2001 From: extio-de Date: Sat, 3 Jan 2026 20:58:21 +0100 Subject: [PATCH] fix(renderer): implement text wrapping in CustomLabel for better multi-line support --- .../g2d/control/components/CustomLabel.java | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/control/components/CustomLabel.java b/src/main/java/de/extio/game_engine/renderer/g2d/control/components/CustomLabel.java index 75f0557..9e02f66 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/control/components/CustomLabel.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/control/components/CustomLabel.java @@ -9,6 +9,8 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; +import java.util.ArrayList; +import java.util.List; import de.extio.game_engine.renderer.ThemeManager; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont; @@ -205,7 +207,57 @@ public class CustomLabel extends Component { final var alignment = this.textAlignment == null ? HorizontalAlignment.CENTER : this.textAlignment; - final var lines = this.caption != null && this.caption.contains("\n") ? this.caption.split("\n", -1) : new String[] { this.caption == null ? "" : this.caption }; + final var rawLines = this.caption != null && this.caption.contains("\n") ? this.caption.split("\n", -1) : new String[] { this.caption == null ? "" : this.caption }; + final var availableWidth = (int) (this.getWidth() / this.scaleFactor); + final List wrappedLines = new ArrayList<>(); + + for (final var rawLine : rawLines) { + if (rawLine.isEmpty()) { + wrappedLines.add(""); + continue; + } + + final var lineWidth = G2DDrawFont.getTextDimensions(rawLine, g2d, this.fontSize, 1.0).getX(); + if (lineWidth <= availableWidth) { + wrappedLines.add(rawLine); + } + else { + final var words = rawLine.split(" "); + final var currentLine = new StringBuilder(); + + for (final var word : words) { + final var testLine = currentLine.isEmpty() ? word : currentLine + " " + word; + final var testWidth = G2DDrawFont.getTextDimensions(testLine, g2d, this.fontSize, 1.0).getX(); + + if (testWidth <= availableWidth) { + if (!currentLine.isEmpty()) { + currentLine.append(" "); + } + currentLine.append(word); + } + else { + if (!currentLine.isEmpty()) { + wrappedLines.add(currentLine.toString()); + currentLine.setLength(0); + } + + final var wordWidth = G2DDrawFont.getTextDimensions(word, g2d, this.fontSize, 1.0).getX(); + if (wordWidth <= availableWidth) { + currentLine.append(word); + } + else { + wrappedLines.add(word); + } + } + } + + if (!currentLine.isEmpty()) { + wrappedLines.add(currentLine.toString()); + } + } + } + + final var lines = wrappedLines.toArray(new String[0]); final var lineHeight = G2DDrawFont.getTextDimensions("M", g2d, this.fontSize, 1.0).getY() + (int) (Math.max(G2DDrawFont.FONT_SIZE_MIN, this.fontSize) * 0.5); final CoordI2[] lineDims = new CoordI2[lines.length]; int maxLineWidth = 0;