我现在已经做了一个基于数组的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;
}发布于 2012-01-17 15:38:13
我认为最好的方法是实现由客户端进入更新JList的服务器的事件触发的侦听器。
发布于 2012-01-17 15:34:46
我应该更新什么?
提供DefaultListModel内容的列表模型( JList )。
是否可以使用运行更新的计时器,或者应该实现当有人进入服务器时运行的更新方法?
第二种选择听起来更好。
发布于 2012-01-17 16:50:50
Swing是单线程的;您必须接受对Swing GUI的所有更改都必须在EventDispatchThread上完成,包括对XxxListModel的更新。您的代码显示了RemoteXxx,然后从某些Listeners或(如您所要求的)从Timer调用一个可能长时间运行的线程。基本上你有两个选择:
1)实现SwingWorker所需的方法:在背景H胎面上调用publish(),在EDT上调用process()和` `done()。
2)在Runnble#Thread中执行Wrap,但是到GUI的所有输出必须包装到invokeLater / invokeAndWait中,包括线程安全方法setText等等。
https://stackoverflow.com/questions/8897205
复制相似问题