Разница между этими двумя DefaultListCellRenderer?

я получил этот класс

public class FooBar {
    private String foo, bar;
    public FooBar(String f, String b) { this.foo = f; this.bar = b; }
    public String getFoo() { return this.foo; }
}

Я хочу поместить некоторые объекты FooBar в JComboBox, которые будут отображать значение foo var. Чтобы сделать это без переопределения toString(), я должен использовать собственный рендерер. В чем разница между этими двумя DefaultListCellRenderer?

public class MyCellRenderer1 extends DefaultListCellRenderer {
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
    {
        if(value != null && (value instanceof FooBar))
            setText(((FooBar) value).getFoo());
        else
            setText(value.toString());

        return this;
    }
}

public class MyCellRenderer2 extends DefaultListCellRenderer {
    @Override
     public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
    {
         Object item = value;

        if(item != null && item instanceof FooBar))
            item = ((FooBar)item).getFoo();     

        return super.getListCellRendererComponent(list, item,
                index, isSelected, cellHasFocus);
    }
}

person Bowser Jr.    schedule 28.05.2014    source источник
comment
Вы говорите нам. Что происходит, когда вы используете каждый из них в своем коде?   -  person Kevin Workman    schedule 28.05.2014
comment
они оба имеют одинаковый эффект, это больше теоретический вопрос   -  person Bowser Jr.    schedule 28.05.2014


Ответы (1)


Разница в... ну... в коде. И что они делают. А если серьезно, главное практическое отличие в том, что второй вызывает метод super. Этот метод будет выполнять основные операции настройки, такие как установка цвета границы и фона на основе флага isSelected и т. д.

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

Однако шаблон использования во втором случае может быть немного запутанным из-за того, что item относится либо к объекту, либо к его строковому представлению. Я бы лично предпочел написать так:

public class MyCellRenderer extends DefaultListCellRenderer {
    @Override
     public Component getListCellRendererComponent(JList list, Object item,
         int index, boolean isSelected, boolean cellHasFocus)
     {
         super.getListCellRendererComponent(list, item,
             index, isSelected, cellHasFocus);
         if (item != null && (item instanceof FooBar))
         {
             FooBar fooBar = (FooBar)item;
             String foo = fooBar.getFoo();
             setText(foo);
         }
         return this;
    }
}

Но это может быть просто вопрос предпочтений.

person Marco13    schedule 28.05.2014