Вы должны реструктурировать свой класс так, чтобы все дочерние элементы MyRender
создавались и добавлялись во время строительства.
getListCellRendererComponent()
следует использовать ТОЛЬКО для изменения значений или визуальных атрибутов (например, фона) существующих компонентов.
Не забывайте, что getListCellRendererComponent()
должен быть максимально быстрым (его можно вызывать довольно часто), поэтому он не должен создавать компоненты, а только модифицировать существующие.
Как правило, вот как должен выглядеть ваш getListCellRendererComponent()
метод:
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value != null) {
User user = (User) value;
String pres = user.getPresence().toLowerCase();
img.setIcon(default_img);
if (pres.contains("unavailable"))
icn.setIcon(off_img);
else
icn.setIcon(on_img);
name.setText(user.getName());
if (isSelected) {
setBackground(Color.lightGray);
panel.setBackground(Color.lightGray);
} else {
setBackground(Color.white);
panel.setBackground(Color.white);
}
}
return this;
}