2010-10-29 16 views
16

Bevor ich das Rad (schlecht) neu erfinde, würde ich gerne wissen, ob es einen vorhandenen Java-Code zum Umwickeln von Textzeilen mit einer gegebenen maximalen Breite gibt. Im Idealfall wäre es:Java-Code zum Umbrechen von Textzeilen auf eine maximale Linienbreite

  • Bezug bestehender Zeilenumbrüche
  • Zerfall Linien, die eine maximale Länge auf Wortgrenzen
  • Zerfall Worte, deren Länge überschreitet die maximale Linienbreite durch Einfügen Bindestriche überschreiten

Edit: Hier gibt es keine "Pixel", nur java.lang.String. "Maximale Breite" bezieht sich auf die Anzahl der Zeichen in einer Zeile.

+2

Thar be Dragons :-) –

+1

Sind Sie nach einem Pixel-perfekten Algorithmus, oder würde eine Approximation tun? – aioobe

Antwort

0

Was Sie nur tun wollen würde funktionieren, wenn Sie die Ergebnisse mit einer Schrift mit fester Breite angezeigt werden soll. Andernfalls wäre die Anzahl der Zeichen in einer Zeile nicht von Zeile zu Zeile gleich. Wenn das für Sie in Ordnung ist, würde ich sagen, dass Ihr Fall ziemlich ungewöhnlich ist (besonders wenn Sie über Silbentrennung nachdenken), also bezweifle ich, dass Sie fertige Lösungen finden werden.

0

Wenn Sie versuchen, einige Arten von Dokumentation zu formatieren, gibt es auch die alte Unix-Roff (oder Abfluss) Familie von Befehlen. Sie müssen nur Formatierungsbefehle einfügen und roff das schwere Heben machen.

1
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; 
} 
+9

Mein Gehirn hat beim Lesen dieses Code-Snippets eine IndexOutOfBoundsException geworfen. :( –

0

Hier ist mein nehmen

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(); 
} 

(Diese Lösung stellt zwei Räume zu einem Raum (so gleichen Fehler, die @jett mit Apache commons WordUtils hat)).