resultado - settext java ejemplo
Código Java para envolver líneas de texto en un ancho de línea máximo (6)
Apache commons tiene WordUtils y la función de ajuste en él:
http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html
PS Parece que esto está abatido y necesitas usar
en lugar.
Antes de reinventar la rueda (mal), me gustaría saber si existe algún código Java existente para ajustar las líneas de texto a un ancho máximo determinado. Lo ideal sería que:
- respetar linebreaks existentes
- Romper líneas que exceden una longitud máxima en los límites de palabras
- rompa las palabras cuya longitud exceda el ancho máximo de línea insertando guiones
Edición: aquí no hay "píxeles", solo java.lang.String. "ancho máximo" se refiere al número de caracteres en una línea.
Aquí está mi toma
private static final String linebreak = "/n"; // or "/r/n";
public static String wrap(String string, int lineLength) {
StringBuilder b = new StringBuilder();
for (String line : string.split(Pattern.quote(linebreak))) {
b.append(wrapLine(line, lineLength));
}
return b.toString();
}
private static String wrapLine(String line, int lineLength) {
if (line.length() == 0) return linebreak;
if (line.length() <= lineLength) return line + linebreak;
String[] words = line.split(" ");
StringBuilder allLines = new StringBuilder();
StringBuilder trimmedLine = new StringBuilder();
for (String word : words) {
if (trimmedLine.length() + 1 + word.length() <= lineLength) {
trimmedLine.append(word).append(" ");
} else {
allLines.append(trimmedLine).append(linebreak);
trimmedLine = new StringBuilder();
trimmedLine.append(word).append(" ");
}
}
if (trimmedLine.length() > 0) {
allLines.append(trimmedLine);
}
allLines.append(linebreak);
return allLines.toString();
}
(Esta solución elimina dos espacios en un espacio (por lo tanto, la misma falla que @jett tiene con WordUtils de Apache commons)).
Lo que quiere hacer solo funcionaría si muestra los resultados con una fuente de ancho fijo. De lo contrario, el número de caracteres en una línea no sería el mismo de una línea a otra. Si eso está bien para ti, diría que el tuyo es un caso bastante poco común (especialmente teniendo en cuenta la separación de palabras), así que dudo que encuentres soluciones ya hechas.
Si está intentando formatear algún tipo de documentación, también existe la antigua familia de comandos roff (o escurrimiento) de Unix. Solo deberías insertar comandos de formato y dejar que roff haga el trabajo pesado.
Utilice la biblioteca de word-wrap (disponible en Maven Central).
Aquí hay una forma de usarlo:
String text = "hello how are you going?";
String wrapped =
WordWrap.from(text)
.maxWidth(10)
.insertHyphens(true) // true is the default
.wrap();
La salida es:
hi there
how are
you going?
La biblioteca conserva los espacios iniciales en las líneas, que es una queja sobre el comportamiento de la oferta de Apache commons-lang . También puede especificar la función stringWidth
para obtener resultados con precisión de píxeles al representar el texto.
La biblioteca tiene una cobertura de prueba unitaria decente (algo a tener en cuenta cuando se considera copiar y pegar fragmentos de código de la web).
La dependencia de Maven es:
<dependency>
<groupId>com.github.davidmoten</groupId>
<artifactId>word-wrap</artifactId>
<version>0.1.1</version>
</dependency>
Asegúrese de verificar si hay una versión posterior.
public static List<String> stringBreak(String string, int maxChar) {
List<String> subLines = new ArrayList<String>();
int length = string.length();
int start = 0;
int end = maxChar;
if (length > maxChar) {
int noOfLines = (length / maxChar) + 1;
int endOfStr[] = new int[noOfLines];
for (int f = 0; f < noOfLines - 1; f++) {
int end1 = maxChar;
endOfStr[f] = end;
if (string.charAt(end - 1) != '' '') {
if (string.charAt(end - 2) == '' '') {
subLines.add(string.substring(start, end - 1));
start = end - 1;
end = end - 1 + end1;
} else if (string.charAt(end - 2) != '' ''
&& string.charAt(end) == '' '') {
subLines.add(string.substring(start, end));
start = end;
end = end + end1;
} else if (string.charAt(end - 2) != '' '') {
subLines.add(string.substring(start, end) + "-");
start = end;
end = end + end1;
} else if (string.charAt(end + 2) == '' '') {
System.out.println("m here ............");
int lastSpaceIndex = string.substring(start, end)
.lastIndexOf("");
subLines.add(string.substring(start, lastSpaceIndex));
start = lastSpaceIndex;
end = lastSpaceIndex + end1;
}
} else {
subLines.add(string.substring(start, end));
start = end;
end = end + end1;
}
}
subLines.add(string.substring(endOfStr[noOfLines - 2], length));
}
return subLines;
}