Написание пользовательского ListCellRenderer

Я хочу написать собственный ListCellRenderer.

Единственное, что должно отличаться от значения по умолчанию, это то, что оно отображает не возвращаемое значение value.toString(), а возвращаемое значение value.myOwnCustomMethodThatReturnsString().

Каков самый простой способ сделать это?

Класс, в котором все это есть, уже реализует ListCellRenderer, и у меня есть:

public Component getListCellRendererComponent(JList<? extends Chapter> list,
        Chapter value, int index, boolean isSelected, boolean cellHasFocus)
{
    return null;
}

Я просто не знаю, что поставить в скобках...


person Karlovsky120    schedule 19.09.2013    source источник
comment
да, я понимаю, нет проблем, для лучшей помощи скорее опубликуйте SSCCE, короткий, исполняемый, компилируемый с жестко запрограммированным значением для myOwnCustomMethodThatReturnsString() в качестве локальной переменной.   -  person mKorbel    schedule 19.09.2013
comment
@mKorbel действительно не нуждается в этом в текущем выпуске   -  person SeniorJD    schedule 19.09.2013
comment
@SeniorJD это работает как сложно в двух трех случаях, которых я не вижу ни в вашем коде, ни в описании, но никто не знает, возможно ли все в Swing, иначе OPs вернется с новым вопросом о   -  person mKorbel    schedule 19.09.2013
comment
@Karlovsky120 в вашем случае практически не имеет ничего общего с SSCCE, вы полностью игнорируете это, не так ли, но есть две важные причины: 1. для других читателей 2. чтобы сократить 10 миллионов возможностей до одного-двух. заполнить XxxListModel из двумерного массива   -  person mKorbel    schedule 19.09.2013
comment
@mKorbel в большинстве случаев ДА, ты прав. Но этот вопрос тоже не требует этого;)   -  person SeniorJD    schedule 19.09.2013
comment
@SeniorJD вопрос не требует этого Тогда хорошо, что mKorbel никогда не подразумевал, что это необходимо. Использовались точные слова: для более быстрой помощи, и что касается получения ответа, это помогает побудить людей копировать/вставлять код, чтобы они могли получить ответ раньше. Это также позволяет людям, которые предоставляют ответы, проверять компиляцию и запуск решения, что, в свою очередь, приводит к лучшим ответам. Я заметил, что вы уже ввели правильный ответ, отлично. Но это не меняет правильности или мудрости предложенного совета.   -  person Andrew Thompson    schedule 19.09.2013


Ответы (1)


Самый простой способ:

public class MyRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList<? extends Chapter> list, Chapter value, int index, boolean isSelected, boolean cellHasFocus)
    {
       Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

       if (c instanceof Jlabel) { // it would work because DefaultListCellRenderer usually returns instance of JLabel
           ((JLabel)c).setText(value.myOwnCustomMethodThatReturnsString()); 
       }

       return c;
    }
}
person SeniorJD    schedule 19.09.2013
comment
Еще проще заменить объект value на пользовательский String перед вызовом super.getListCellRendererComponent. Тогда вам не нужно возиться с JLabel. - person Holger; 19.09.2013
comment
@Holger проще, но не правильнее. В данном случае вы, конечно, правы ;) - person SeniorJD; 19.09.2013
comment
@Karlovsky120 Karlovsky120 на случай, если у вас сложная система Renderer и ваш суперкласс не является DefaultListCellRenderer, поэтому, например, требуется полная информация о вашем объекте Chapter. - person SeniorJD; 19.09.2013
comment
Я понимаю. Еще раз спасибо. - person Karlovsky120; 19.09.2013