[英]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.