1

我上了这门课

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);
    }
}
4

1 回答 1

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;
    }
}

但这可能只是偏好问题。

于 2014-05-28T13:02:08.980 回答