如果你使用了Synth 對于JList,JComboBox來說,在自定義Render的時候, 如果繼承自DefaultListCellRender 是不能同時起到期望的效果的,不僅僅是DefaultListCellRender ,所有以Default開頭的Render都是這樣,其具體原因是因為Synth 需要使用其內部定義的Render,具體可以參考SynthComboBoxUI 或者相似的一個Synth 的UI代理。

所以當你使用了DefaultListCellRender 之后,在xml文件中定義的效果是不會生效的,目前可以通過如下的折中方式來達到目的:

// first get render from UI

final ListCellRenderer oldRender = jbCbx.getRenderer();


      jbCbx.setRenderer(new ListCellRenderer(){
                public Component getListCellRendererComponent(JList list,Object value, int index, boolean isSelected,boolean cellHasFocus) {
                 JLabel render = (JLabel) oldRender.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus);
                    JBod jbod = (JBod)value;
                    render.setText(jbod.getName());
                    return render;
                }
            });

 

Reference: Don’t subclass DefautListCellRenderer for Swing’s Nimbus LAF