列表选择不会在摇摆中发生

时间:2011-01-27 06:46:54

标签: java swing selection jlist

嗨,我有一个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 个答案:

答案 0 :(得分:2)

您错误地实现了单元格渲染器。渲染器负责将渲染器背景设置为选择颜色。

阅读JList API并按照指向“如何使用列表”的Swing教程的链接,您将在其中找到使用JList的工作示例。您还可以找到有关编写渲染器和示例的部分。

编辑:另外,我刚刚注意到您正在渲染器代码中读取您的图标。你永远不应该这样做。只有在创建渲染器时才会读取图标,然后缓存图标。每次需要重新绘制一个单元格时,都会调用渲染器,因此继续阅读该图标效率不高。

答案 1 :(得分:0)

在您的单元格渲染器上,您必须实现isSelected为true的情况。对于ListCellRenderer

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