Word Wrap в Java Swing с жестким ограничением пикселей - PullRequest
0 голосов
/ 16 сентября 2018

У меня проблемы с реализацией переноса слов в java в среде свинга. У меня жесткий предел в пикселях, который я не могу преодолеть. Я чувствую, что я близок, поскольку нашел решение, которое оборачивается, но оно позволяет последнему слову превышать предел перед переходом к следующей строке.

'ni' - это буферизованное изображение, к которому все это рисуется.

Пользовательский класс 'theSettings', содержащий переменные для текста.

'theText' - строка, которую нужно обернуть.

Вот что передается методу:

FontMetrics fm = ni.createGraphics().getFontMetrics(theSettings.getFont());
//Get pixel width of string and divide by # of characters in string to get estimated width of 1 character
int charPixelWidth = fm.stringWidth(theText) / theText.length();
int charWrap = theSettings.getPixelsTillWrap() / charPixelWidth;
List<String> textList = testWordWrap(theText, charWrap);

Я использую этот метод для проверки:

//Custom String Wrapper as StringUtils.wrap keeps cutting words in half
public static List<String> testWordWrap(String wrapMe, int wrapInChar) {
    StringBuilder sb = new StringBuilder(wrapMe);

    int count = 0;
    while((count = sb.indexOf(" ", count + wrapInChar)) != -1) {
        sb.replace(count, count + 1, "\n");
    }

    String toArray = sb.toString();
    String[] returnArray = toArray.split("\\n");

    ArrayList<String> returnList = new ArrayList<String>();
    for(String s : returnArray) {
        returnList.add(s);
    }

    return returnList;
}

Пример использования: enter image description here enter image description here

Я также заменяю изображения в середине текста, но размер изображения точно соответствует размеру текста, который он заменяет; так что это не должно быть проблемой. Синие линии - это ограничивающие рамки, которые показывают, где должна заканчиваться упаковка. Это показывает, что текст продолжает рисовать. Мне нужна функция для переноса «успешно» на следующую строку; поскольку упаковка не может перебежать в любой ситуации.

РЕДАКТИРОВАТЬ: массивы изображения запускаются как .toString();

[Разрешение: + | FT | если вам это удалось, и соответствует | EA |]

[Любой: + | MT | когда вы получаете любое число, из | QT |]

1 Ответ

0 голосов
/ 16 сентября 2018

Мне удалось определить ответ. Я разбил строку на пробелы, а затем попытался добавить каждое слово по одному. Если это слишком долго, переходите к следующей строке. Здесь это слишком прокомментировано, чтобы помочь кому-либо еще с этой же проблемой. Ура!

//@Author Hawox
//split string at spaces
//for loop checking to see if adding that next word moves it over the limit, if so go to next line; repeat
public static List<String> wordWrapCustom(String wrapMe, FontMetrics fm, int wrapInPixels){
    //Cut the string into bits at the spaces
    String[] split = wrapMe.split(" ");

    ArrayList<String> lines = new ArrayList<String>(); //we will return this, each item is a line
    String currentLine = ""; //All contents of the currentline

    for(String s : split) {
        //Try to add the next string
        if( fm.stringWidth(currentLine + " " + s) >= wrapInPixels ) {
            //Too big
            if(currentLine != "") { //If it is still bigger with an empty string, still add at least 1 word
                lines.add(currentLine); //Add the line without this string 
                currentLine = s; //Start next line with this string in it
                continue;
            }
        }
        //Still have room, or a single word that is too big
        //add a space if not the first word
        if(currentLine != "")
            currentLine = currentLine + " ";

        //Append string to line
        currentLine = currentLine + s;
    }
    //The last line still may need to get added
    if(currentLine != "") //<- Should not get called, but just in case
        lines.add(currentLine);

    return lines;
}
...