我有一个JComboBox,用于选择Font。为了在用户进行选择时允许预览字体,我已经编写了自定义ListCellRenderer:
public class FontListCellRenderer implements ListCellRenderer<String>{
private ListCellRenderer<Object> defaultRenderer;
@SuppressWarnings("unchecked")
public FontListCellRenderer(){
this.defaultRenderer = (ListCellRenderer<Object>) new JComboBox<Object>().getRenderer();
}
@Override
public Component getListCellRendererComponent(JList<? extends String> list,
String value, int index, boolean isSelected, boolean cellHasFocus) {
Component returnVal = this.defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
returnVal.setFont(new Font((String) value, returnVal.getFont().getStyle(), returnVal.getFont().getSize()));
return returnVal;
}
}
在使用此功能时,我发现在使用此JComboBox初始化ListCellRenderer时会出现严重的性能损失。经过进一步调查后,我发现当我使用ListCellRenderer设置项目的默认值时,我的setSelectedItem()被调用了许多字体。
现在我已将代码更改为最后设置ListCellRenderer,但我想知道为什么会发生这种情况?即使我的项目在屏幕上(它还没有),ListCellRenderer也不会呈现所选项目,因为它在JComboBox中显示为空闲。即使它是,为什么要调用未选择的项目?