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

Java 如何在使用DefaultListModel()添加或删除元素时更新JList,java,swing,jlist,defaultlistmodel,Java,Swing,Jlist,Defaultlistmodel,我知道这个问题以前被问过很多次。然而,我花了数小时研究更新JList的方法,但我无法处理此问题。我正在尝试实现一个JList,它显示谁在线或离线。(它保存JLabels,我想这是保存带有图标的字符串的唯一方法)。我有自己的CellRenderer(),就像 public class UserRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererCompo

我知道这个问题以前被问过很多次。然而,我花了数小时研究更新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]);
                }
        }
    }
}
我可以保证逻辑系统工作正常(我可以在后台检查操作是否正常)。唯一的问题是,有时连接到服务器JList的客户端看起来是空的,即使它将元素添加到模型中。我将感谢你的每一个回答。谢谢你

只是评论,不是回答

不需要一维
JList

if(value instanceof ClientObject){
因为
对象
来自

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

返回相同的值,然后测试此值
if==或equals
..

调用
model.fireContentsChanged()
方法


首先感谢您的回复。另一方面,我通过在需要更新时创建新模型来纠正我的问题。所以代码段是这样的

DefaultListModel tempModel = new DefaultListModel();

// add or remove elements from tempModel

buddyList.setModel( tempModel );

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

我不能调用该方法,因为我使用处理此问题的
DefaultListModel()itself@quartaela:不应在模型外部激发模型方法;您应该使用
DefaultListModel
的方法修改模型。好的,我解决了这个问题。每次模型需要更新时,我都会创建一个新模型并构建它。稍后,我再次设置了JList的模型。因此,像测试
if(value.equals(clientObject))
这样的对象也会做同样的事情吗?请验证
ListModel
是否正在更改。创建XxxModel一次,
DefaultListModel tempModel = new DefaultListModel();

// add or remove elements from tempModel

buddyList.setModel( tempModel );