包裹文本行的最大线宽Java代码

问题描述 投票:19回答:6

我在重新发明轮子(很差),我想知道是否有包裹文本行给定的最大宽度的一些现有的Java代码。理想的情况下它会:

  • 尊重现有的换行符
  • 分手是在字边界超出最大长度线
  • 分手的字,其长度超过通过将连字符的最大线宽度

编辑:有没有“像素”在这里,只有java.lang.String中。 “最大宽度”指的是字符的行上的号码。

java text line-breaks word-wrap
6个回答

1
投票

使用word-wrap库(Maven的中央可用)。

下面是使用它的一种方式:

String text = "hello how are you going?";
String wrapped = 
  WordWrap.from(text)
    .maxWidth(10)
    .insertHyphens(true) // true is the default
    .wrap();

输出是:

hi there
how are
you going?

图书馆节省领先的是关于Apache公地琅发行行为的一个投诉线空间。您也可以指定stringWidth功能渲染文本时获得像素精确的结果。

图书馆有体面的单元测试覆盖率(东西记住,当你考虑复制以及从网页代码块粘贴来承担!)。

Maven的依赖关系是:

<dependency>
  <groupId>com.github.davidmoten</groupId>
  <artifactId>word-wrap</artifactId>
  <version>0.1.1</version>
</dependency>

一定要检查是否有更新的版本。


1
投票

这里是我的起飞

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

(此溶液条两个空间,以该@jett具有与Apache公地WordUtils)一个空间(因此相同故障)。


0
投票

你想做的事,如果你显示与固定宽度字体的结果只会工作什么。否则,字符的行数不会从线到线相同。如果是细跟你,我会说,你的是一个相当罕见的情况下(尤其是考虑断字),所以我怀疑你会找到现成的解决方案。


0
投票

如果你想格式化文档中的某些方式,有也命令的旧的Unix的roff(或径流)的家庭。你只需要插入格式化命令,让roff的做繁重。


0
投票
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.