Как я могу обрезать строки в Java2D и добавить в конце?

Я пытаюсь распечатать счета в приложениях 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);

I.e Как я могу ограничить myString максимальным размером 120 пикселей?

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

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

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

person Jonas    schedule 17.05.2010    source источник


Ответы (2)


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

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

person corsiKa    schedule 17.05.2010

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

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

person mdma    schedule 17.05.2010