简体   繁体   English

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

[英]How to update JList while adding or removing elements with using DefaultListModel()

i know this question asked many times before. 我知道这个问题以前问过很多次。 However, i spent on hours to research about a way to update a JList, and i couldn't handle with this issue. 但是,我花了几个小时来研究更新JList的方法,但我无法处理这个问题。 I'm trying to implement a JList which shows who is online or offline.(It holds JLabels i guess this is the only way for holding a string with an icon). 我正在尝试实现一个JList来显示谁在线或离线(它持有JLabels,我猜这是持有带有图标的字符串的唯一方法)。 I have my own CellRenderer() which is like; 我有自己的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);
       }
    }

}

Moreover, i construct client's list whenever he/she gets connected to server with this way; 而且,只要他/她以这种方式连接到服务器,我就会构造客户的清单。

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]);
                }
        }
    }
}

The trick which i use when a client changed his/her status (becomes online/offline) is i get rid off all elements with model.clear() and start to construct the list again. 当客户更改其状态(变为在线/离线)时,我使用的技巧是使用model.clear()摆脱所有元素, model.clear()再次开始构建列表。 Here is the code segment; 这是代码段;

       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);
                }                      
          }
       }

I can assure that logical system works fine.(I can check the actions if they are working properly on background). 我可以确保逻辑系统运行正常。(我可以检查操作是否在后台正常运行)。 Only the problem is sometimes when a client connected to server JList looks blank even though it adds elements into model. 唯一的问题是有时即使连接到服务器JList的客户端看起来空白,即使它向模型中添加了元素也是如此。 i will appreciate for every answer. 我会很感激每个答案。 And thanks anyway 还是谢谢你

only comment, not an answer 只评论,不回答

there no require for one dimensional JList 不需要一维JList

if(value instanceof ClientObject){

because Object from 因为Object

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

returns the same value, then to test this value if == or equeals ... 返回相同的值,然后if == or equeals ,则测试此值...

First of all thanks for all your replies. 首先感谢您的所有答复。 On the other hand, i corrected my issue with creating a new model whenever it has to be get updated. 另一方面,无论何时需要更新,我都会创建一个新模型来纠正我的问题。 So the code segment is like this; 所以代码段是这样的;

DefaultListModel tempModel = new DefaultListModel();

// add or remove elements from tempModel

buddyList.setModel( tempModel );

i'm not sure about if it is the only correct way but at least it works. 我不确定这是否是唯一正确的方法,但至少能奏效。

Call model.fireContentsChanged() method. 调用model.fireContentsChanged()方法。

JavaDoc on AbstractListModel JavaDoc on AbstractListModel

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM