Как я могу обрезать строки в Java2D и добавить ... в конце? - PullRequest
3 голосов
/ 17 мая 2010

Я пытаюсь распечатать счета в приложениях Java Swing. Я делаю это путем расширения Printable и реализации метода public int print(Graphics g, PageFormat pf, int page).

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

Часть моего кода:

Font headline = new Font("Times New Roman", Font.BOLD, 14);
g2d.setFont(headline);
FontMetrics metrics = g2d.getFontMetrics(headline);
g2d.drawString(myString, 0, 20);

Т.е. как я могу ограничить myString максимальным 120px?

Я мог бы использовать metrics.stringWidth(myString), но я не получил позицию, где я должен обрезать строку.

Ожидаемые результаты могут быть:

A longer string that exc...
A shorter string.
Another long string, but OK

Ответы [ 3 ]

1 голос
/ 17 мая 2010

Вы можете получить хорошую оценку, взяв stringWidth, разделенную на количество символов, чтобы получить среднюю ширину на символ. Затем вы можете взять расстояние клипа, чтобы увидеть, сколько символов вы можете вписать. Возьмите подстроку от начала до почти этого расстояния (минус два или три для ...) и поместите ... в конец.

Убедитесь, что новая строка не обрезается - если это так, внесите необходимые изменения. В конце концов, если у вас есть WWWWWWWWiiiiii, вам, вероятно, придется это настроить. Но в целом этот подход будет довольно быстрым.

0 голосов
/ 20 ноября 2012
String cutString(String originalString, int placeholderWidth, FontMetrics fontMetrics) {
    int stringWidth = fontMetrics.stringWidth(originalString);
    String resultString = originalString;

    while (stringWidth >= placeholderWidth) {
        resultString = resultString.substring(0, resultString.length() - 4);
        resultString = resultString.concat("...");
        stringWidth = fontMetrics.stringWidth(resultString);
    }

    return resultString;
}
0 голосов
/ 17 мая 2010

Как только вы узнаете, что строка должна быть обрезана, вы можете использовать двоичный поиск, чтобы увидеть, сколько символов вы можете отобразить, включая суффикс elipsis.

Это похоже на то, что вы должны попробовать N-1 символов, N-2, N-3 и т. Д., Пока не найдете подстроку + "...", которая помещается в допустимое пространство. Но вместо того, чтобы выполнять линейную итерацию, вы используете бинарный поиск, чтобы найти количество символов с меньшим количеством попыток.

...