2010-05-17 4 views
3

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

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

Некоторые из моего кода:

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 

ответ

1

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

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

0

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

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

-1
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; 
}