首页
学习
活动
专区
圈层
工具
发布

更新JList
EN

Stack Overflow用户
提问于 2012-01-17 15:26:12
回答 3查看 902关注 0票数 3

我现在已经做了一个基于数组的JList,并由defaultlistmodel填充。当人员连接到服务器时,列表将添加人员,但它不会显示连接的人,也不会显示随后连接的人。所以,我必须更新JList。

我的问题是:

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

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

这里是一些代码:

GUI:

代码语言:javascript
复制
jList2 = new javax.swing.JList();
try{
jList2.setModel(gl.getUsersOnlineAsDefaultListModel(gl.getClients())
    );
}catch(RemoteException ex){
    System.out.println(ex);
}
jScrollPane3.setViewportView(jList2);

GUI逻辑:

代码语言:javascript
复制
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();
    }

服务器端:

代码语言:javascript
复制
ArrayList clients = new ArrayList<Client>();

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-17 15:38:13

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

票数 3
EN

Stack Overflow用户

发布于 2012-01-17 15:34:46

我应该更新什么?

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

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

第二种选择听起来更好。

票数 3
EN

Stack Overflow用户

发布于 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等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8897205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档