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



我知道这个问题以前被问过很多次了。然而,我花了几个小时研究更新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的客户机看起来是空白的,即使它向模型中添加了元素。我将感谢每一个答案。谢谢大家

只有评论,没有回答

不需要一维JList

if(value instanceof ClientObject){

because Object from

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

返回相同的值,然后测试这个值if == or equeals

首先感谢大家的回复。另一方面,我纠正了在需要更新时创建新模型的问题。代码段是这样的;

DefaultListModel tempModel = new DefaultListModel();
// add or remove elements from tempModel
buddyList.setModel( tempModel );

我不确定这是否是唯一正确的方法,但至少它是有效的

调用model.fireContentsChanged()方法

JavaDoc on AbstractListModel

相关内容

  • 没有找到相关文章

最新更新