【问题标题】:Updating an JList更新 JList
【发布时间】:2012-01-17 15:26:12
【问题描述】:

我现在创建了一个基于数组列表的 JList,并由默认列表模型填充。该列表会在他们连接到服务器时添加人员,但不会显示连接的人或之后连接的人。所以,我必须更新 JList。

我的问题是:

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

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

以下是部分代码:

图形用户界面:

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

图形用户界面逻辑:

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;          
}

【问题讨论】:

  • 所以,我最终使用了回调,它运行了我已经拥有的 updateJlist 方法。现在一切正常

标签: java swing


【解决方案1】:

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

【讨论】:

  • 听起来不错。我猜这里有一些关于如何做到这一点的文档?
  • 是否可以在arraylist上“监听”,如果添加了一个客户端,会更新JList吗?
【解决方案2】:

我应该更新什么?

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

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

第二个选项听起来更好。

【讨论】:

  • 谢谢 :) 我想我得做一些研究
【解决方案3】:

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

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

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

【讨论】:

猜你喜欢
  • 2014-03-09
  • 2011-10-12
  • 2014-01-12
  • 2016-07-15
  • 2012-10-07
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多