java - 如何使用 DefaultListModel() 添加或删除元素时更新 JList

标签 java swing jlist defaultlistmodel

我知道这个问题以前被问过很多次。然而,我花了几个小时研究更新 JList 的方法,但我无法处理这个问题。我正在尝试实现一个 JList,它显示谁在线或离线。(它保存 JLabels,我想这是保存带有图标的字符串的唯一方法)。我有自己的 CellRenderer() ,就像;

public class UserRenderer extends DefaultListCellRenderer {


    @Override
    public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean hasFocus) {

       if(value instanceof ClientObject){

           final ClientObject clientObject = (ClientObject) value;
           JLabel label = (JLabel) super.getListCellRendererComponent(list, clientObject.getNickName(), index, isSelected, hasFocus);

           if(clientObject.isIsOnline()){

               label.setIcon(iconArray[1]);
           }
           else{

               label.setIcon(iconArray[0]);
           }

           return label;
       }

       else {

           return super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
       }
    }

}

此外,每当他/她通过这种方式连接到服务器时,我都会构建客户端的列表;

private void buildBuddyList(ClientObject tempClientObject){

    if( tempClientObject.getBuddyList().size() > 0 ){

        mainClient.setBuddyList(tempClientObject.getBuddyList());

        for (Iterator<ClientObject> iter = mainClient.getBuddyList().iterator(); iter.hasNext();) {

            ClientObject tempon = iter.next();

                if(tempon.isIsOnline()){

                    model.addElement(tempon);
                    labelIconList.put(tempon, iconArray[1]);
                }

                else{

                    model.addElement(tempon);
                    labelIconList.put(tempon, iconArray[0]);
                }
        }
    }
}

当客户更改他/她的状态(变为在线/离线)时,我使用的技巧是使用 model.clear() 删除所有元素并开始再次构建列表。这是代码段;

       if(tempClientObject.isStatusChanged()){

          if(tempClientObject.isIsConnected()){ 

                System.out.println(tempClientObject.getUserName() + " is ONLINE");

                model.clear();

                for (Iterator<Map.Entry<ClientObject,ImageIcon>> iter = labelIconList.entrySet().iterator(); iter.hasNext();) {

                    Map.Entry<ClientObject,ImageIcon> pairs = iter.next();

                    ClientObject changedOnlineStatusClient = (ClientObject) pairs.getKey();

                    if(changedOnlineStatusClient.getUserName().equals(tempClientObject.getUserName())){

                        changedOnlineStatusClient.setIsOnline(tempClientObject.isIsOnline());
                    }

                    model.addElement(changedOnlineStatusClient);
                }
          }

          else{

                System.out.println(tempClientObject.getUserName() + " is OFFLINE");                

                model.clear();

                for (Iterator<Map.Entry<ClientObject,ImageIcon>> iter = labelIconList.entrySet().iterator(); iter.hasNext();) {
                    Map.Entry<ClientObject,ImageIcon> pairs = iter.next();
                    ClientObject changedOnlineStatusClient = (ClientObject) pairs.getKey();

                    if(changedOnlineStatusClient.getUserName().equalsIgnoreCase(tempClientObject.getUserName())){

                        changedOnlineStatusClient.setIsOnline(tempClientObject.isIsOnline());
                    }

                    model.addElement(changedOnlineStatusClient);
                }                      
          }
       }

我可以保证逻辑系统工作正常。(我可以检查操作是否在后台正常工作)。唯一的问题是,有时连接到服务器 JList 的客户端看起来是空白的,即使它向模型中添加了元素。我会感谢每一个答案。无论如何,谢谢

最佳答案

only comment, not an answer

不需要一维JList

if(value instanceof ClientObject){

因为对象来自

getListCellRendererComponent(JList list, Object value, int index, 
       boolean isSelected, boolean hasFocus) {

返回相同的值,然后测试该值if == or equeals ...

关于java - 如何使用 DefaultListModel() 添加或删除元素时更新 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15999640/

相关文章:

java - 启动 Eclipse 平台时出现 MESSAGE 异常

java - 简单可靠的内存数据库,用于快速 Java 集成测试,支持 JPA

java 更新 Jpanel 组件

java - 为什么从不调用 getToolTipText?

java - 将 JList 与模型一起使用?

java - 数据库访问最佳实践 - 联系人列表

java - Intellij 14 说 "Internal caches are corrupted or have outdated format"?

java - 如何修复 "MissingBackpressureException"

java - 表中的 JProgressBar 动画

java - 为什么在这种特殊情况下向 JList 添加元素会使其为空?