2010-10-29 23 views
16

Zanim ponownie wymyślę koło (słabo), chciałbym się dowiedzieć, czy istnieje jakiś istniejący kod Java do zawijania linii tekstu do podanej maksymalnej szerokości. Idealnie byłoby to:Kod Java do zawijania linii tekstu do maksymalnej szerokości linii

  • poszanowaniu istniejących linebreaks
  • zerwać linie, które przekraczają maksymalną długość na granicy słów
  • zerwać słowa, których długość przekracza maksymalną szerokość linii przez wstawianie myślnikami

Edycja: nie ma tu "pikseli", tylko java.lang.String. "maksymalna szerokość" odnosi się do liczby znaków w linii.

+2

Thar be Dragons :-) –

+1

Czy podążacie za algorytmem idealnie podobnym do piksela, czy też może to zrobić w przybliżeniu? – aioobe

Odpowiedz

0

Co chcesz zrobić będzie działać tylko wtedy, gdy wyświetlane wyniki z czcionką o stałej szerokości. W przeciwnym razie liczba znaków w wierszu nie byłaby taka sama od linii do linii. Jeśli ci to nie przeszkadza, powiedziałbym, że twój jest dość rzadkim przypadkiem (zwłaszcza jeśli chodzi o dzielenie wyrazów), więc wątpię, że znajdziesz gotowe rozwiązania.

0

Jeśli próbujesz sformatować pewien rodzaj dokumentacji, istnieje również stara rodzina poleceń rx (lub spływu). Trzeba po prostu wstawić polecenia formatowania i pozwolić roffowi na ciężkie podnoszenie.

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

Mój mózg rzucił wyjątek IndexOutOfBoundsException podczas czytania tego fragmentu kodu. :( –

0

Oto mój wziąć

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

(To rozwiązanie wycieczki dwie przestrzenie do jednego miejsca (tak samo wina, że ​​@jett ma z Apache Commons WordUtils)).