繁体   English   中英

更新JList

[英]Updating an JList

我现在已经创建了一个基于arraylist的JList,并且由defaultlistmodel填充。 该列表将在人们连接到服务器时添加人员,但不会显示连接的人或连接后的人。 所以,我必须更新JList。

我的问题是:

我应该更新什么? 是否可以使用运行更新的计时器,还是应该实现在有人进入服务器时运行的更新方法?

PS。 这是一个聊天服务器,很像IRC。

以下是一些代码:

GUI:

jList2 = new javax.swing.JList();
try{
jList2.setModel(gl.getUsersOnlineAsDefaultListModel(gl.getClients())
    );
}catch(RemoteException ex){
    System.out.println(ex);
}
jScrollPane3.setViewportView(jList2);

GUI逻辑:

public DefaultListModel getUsersOnlineAsDefaultListModel(ArrayList<Client> clients) throws RemoteException {
DefaultListModel result = new DefaultListModel();
for(Client c : clients){
    result.addElement(c.findName());
}
    return result;
}

    public ArrayList<Client> getClients() throws RemoteException, NullPointerException{
            return cf.getClients();
    }

服务器端:

ArrayList clients = new ArrayList<Client>();

public ArrayList<Client> getClients(){
    return clients;          
}

我应该更新什么?

列表模型( DefaultListModel ),它提供JList的内容。

是否可以使用运行更新的计时器,还是应该实现在有人进入服务器时运行的更新方法?

第二种选择听起来更好。

我认为最好的方法是实现客户端进入更新JList的服务器触发的侦听器。

Swing是单线程的; 您必须接受必须在EventDispatchThread上对Swing GUI进行所有更改,包括对XxxListModel更新。 您的代码显示RemoteXxx ,然后您从一些Listeners或(如您RemoteXxx )从Timer调用可能长时间运行的线程。 基本上你有两个选择:

1)实现SwingWorker所需的方法:在后台htread上调用publish() ,在EDT上调用process()和`done()。

2)在Runnble#Thread包装执行,但是所有输出到GUI的必须包装到invokeLater / invokeAndWait ,包括线程安全方法setText等。

暂无
暂无

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

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