Выбор списка не происходит в разгаре - PullRequest
0 голосов
/ 27 января 2011

Привет, у меня есть JLIST, и я назначил ему cellRenderer.но я не смог выбрать элемент в списке.На самом деле он выбран, но визуально мы не можем видеть, что он выбран, значит, я не смог увидеть, какой элемент выбран в списке.

Снимок экрана моего списка: enter image description here

иожидается enter image description here

Второй снимок экрана без CellRenderer.Но когда я добавил CellRenderer, я не смог увидеть выбранный элемент в списке.

это нормальное поведение, когда вы добавляете CellRenderer в список.

что я делаю неправильно ???

РЕДАКТИРОВАТЬ: -

это мой класс CellRenderer:

public class ContactsRender extends JLabel implements ListCellRenderer {

    private static final long serialVersionUID = 1L;

    ImageIcon img;

    public ContactsRender(){
        setOpaque(true);
        setIconTextGap(12);
        setBackground(Color.WHITE);
        setForeground(Color.black);
    }

    @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();
            if(pres.contains("unavailable")){
                img = new ImageIcon("res/offline.jpg");
            } else {
            img = new ImageIcon("res/online.jpg");
            }
            setText(user.getName());
            setIcon(img);

            return this;
        }
        return null;
    }

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Вы неправильно внедрили средство визуализации ячеек.Рендерер отвечает за установку фона рендера на цвет выделения.

Прочитайте JList API и перейдите по ссылке на учебник Swing в разделе «Как использовать списки», где вы найдете рабочие примеры, использующие JList.Вы также найдете раздел о написании рендерера и пример.

Редактировать: Кроме того, я только что заметил, что вы читаете свою иконку в коде рендерера.Вы никогда не должны делать это.Значок должен быть прочитан только один раз при создании средства визуализации, а затем вы кэшируете значок.Каждый раз, когда необходимо перерисовать ячейку, вызывается средство визуализации, поэтому неэффективно продолжать читать значок.

0 голосов
/ 27 января 2011

В вашем устройстве визуализации ячеек вы должны реализовать случай, когда isSelected - true. Для вашего ListCellRenderer :

Component getListCellRendererComponent(JList<? extends E> list,
                                       E value,
                                       int index,
                                       boolean isSelected,
                                       boolean cellHasFocus)
{
 if (!isSelected) doThis(index);
 else doThatForSelectedItem(index);
}
...