Как отобразить текст в поле и заменить лишние три точки - PullRequest
0 голосов
/ 01 августа 2009

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

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight();
int ellw = fm0.stringWidth("\u2026");
int titleWidth = fm0.stringWidth(se.title);
if (titleWidth > getWidth()) {
    for (int i = se.title.length() - 1; i > 0; i--) {
        String tstr = se.title.substring(0, i);
        int tstrw = fm0.stringWidth(tstr);
        if (tstrw + ellw < getWidth()) {
            g2.drawString(tstr, 2, h);
            g2.drawString("\u2026", 2 + tstrw, h);
            break;
        }
    }
} else {
    g2.drawString(se.title, 2, h);
}

Есть ли лучший способ определить, сколько символов мне нужно drawString(), прежде чем переключаться на символ ... (u2026)?

Ответы [ 2 ]

0 голосов
/ 01 августа 2009

Это стандартное поведение рендерера по умолчанию для таблицы, поэтому я не уверен, что понимаю причину этого.

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

0 голосов
/ 01 августа 2009

Я не могу придумать другого способа достижения желаемого эффекта, но вы должны иметь возможность заменить 2 вызова drawString () на один. Прошло много времени с тех пор, как я написал Java, но я думаю, что следующее должно работать.

Кстати, я изменил имена переменных, чтобы я мог прочитать код. : Р

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight();
int titleWidth = metrics.stringWidth(se.title);

if (titleWidth > getWidth()) {
    String titleString;

    for (int i = se.title.length() - 1; i > 0; i --) {
        titleString = se.title.substring(0, i) + "\u2026";
        titleWidth = metrics.stringWidth(titleString);

        if (titleWidth < getWidth()) {
            g2.drawString(titleString, 2, fontHeight);

            break;
        }
    }
} else {
    g2.drawString(se.title, 2, fontHeight);
}
...