为什么在使用setSelectedItem()时调用ListCellRenderer?

时间:2014-03-11 19:04:34

标签: java swing jcombobox listcellrenderer

我有一个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中显示为空闲。即使它是,为什么要调用未选择的项目?

0 个答案:

没有答案