我得到了这个课程
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; }
}
我想在JComboBox中放置一些FooBar对象,它将显示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);
}
}
答案 0 :(得分:2)
区别在于......嗯......代码。他们做了什么。但严重的是,主要的实际区别是第二个调用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;
}
}
但这可能只是偏好问题。