Почему мой пользовательский ListCellRenderer игнорирует мои вызовы setText?

Я создал собственный ListCellRenderer, который расширяет StyledLabel от Jidesoft. JList, в котором используется мой модуль визуализации, имеет фиксированную ширину, поэтому в моем модуле визуализации я пытаюсь сократить текст на основе этой ширины. Я вызываю setText в getListCellRendererComponent, что иногда работает. Когда я выбираю ячейку, текст ведет себя так, как будто я никогда его не сокращал. Нет ветвления, связанного с setText и сокращением текста.

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

редактировать: какой-то код

public class CustomListCellRenderer extends StyledLabel implements ListCellRenderer {

    public Component getListCellRendererComponent(
        JList list, 
        Object value, 
        int index, 
        boolean isSelected, 
        boolean cellHasFocus)   {
    setText(shortenName(value.toString(), 150));

    return this;
}

    private String shortenName(String name, int width)  {
    if(this.getGraphics() != null)  {
        final FontMetrics fontMetrics = this.getFontMetrics(this.getFont());

        String end = name.substring(name.length()/2);
        String beginning = name.substring( 0, name.length()/2);

        int stringWidth = SwingUtilities.computeStringWidth(fontMetrics, name);

        if(stringWidth < width)
            return name;

        do  {
            end = end.substring(1);
            beginning = beginning.substring(0, beginning.length() - 1);

            stringWidth = SwingUtilities.computeStringWidth(fontMetrics, beginning + "..." + end);
        } while (stringWidth > width);
        return beginning + "..." + end;
    }
    return name;
   }
    public static void main(String[] args)  {
    JFrame frame = new JFrame();
    JList list = new JList(new String[] {
            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
            "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"});
    list.setCellRenderer(new CustomListCellRenderer());
    frame.getContentPane().add(list);
    frame.setVisible(true);
}
}

person tM --    schedule 15.04.2014    source источник
comment
Нам чрезвычайно сложно отлаживать ваш код, если вы не показываете нам свой код.   -  person takendarkk    schedule 16.04.2014
comment
@Takendarkk добавил немного кода.   -  person tM --    schedule 16.04.2014
comment
Не знаю, почему вы расширяете StyledLabel. Все, что вы делаете, это пытаетесь установить текст, так почему бы не расширить средство визуализации по умолчанию? Не забудьте вызвать super.getListCellRendererComponent(...), чтобы получить поведение выделения по умолчанию. Я бы не стал жестко кодировать ширину строки. Ширина должна основываться на ширине JList.   -  person camickr    schedule 16.04.2014
comment
Мне нужен StyledLabel для стилизации позже в проекте, то, что я разместил здесь, является чрезвычайно упрощенной версией. Спасибо за совет.   -  person tM --    schedule 16.04.2014


Ответы (1)


В вашей реализации ListCellRenderer вы полагаетесь на getGraphics() метки. Иногда getGraphics() равно null, что нормально, но вы не вводите условие if(this.getGraphics() != null) и просто возвращаете неизмененную строку. Вот почему вы получаете противоречивые результаты. Комментирование этого условия решило проблему в опубликованном коде. Вы не должны полагаться на getGraphics(), его значение находится вне вашего контроля.

person tenorsax    schedule 15.04.2014
comment
Как еще я могу использовать FontMetrics? Или стоит отказаться от этого подхода? - person tM --; 16.04.2014
comment
@tM-- не уверен, что ты имеешь в виду. вы получаете FontMetrics, используя getFontMetrics(). Только не обуславливайте это if(this.getGraphics() != null). - person tenorsax; 17.04.2014
comment
Извините, я думал, что getFontMetrics() по какой-то причине полагался на getGraphics(). Удаление этого условия сработало - спасибо. - person tM --; 17.04.2014