Я получил этот класс
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);
}
}
Разница - это... ну... код. И что они делают. Но серьезно, основное практическое различие заключается в том, что второй вызывает super
метод. Этот метод будет выполнять основные операции настройки, такие как установка границы и цвета фона на isSelected
флага 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;
}
}
Но это может быть только вопросом предпочтений.