2012-01-17 69 views
3

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

我的问题是:

我应该更新什么?是否有可能使用运行更新的计时器,或者是否应该实施在某人进入服务器时运行的updatemethod?

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

所以,我结束了使用回调,跑的updateJlist方法我已经有了。一切正常现在 – sindrem 2012-01-19 11:48:45

回答

3

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

+0

这听起来不错。我猜这里有一些关于如何做到这一点的文档? – sindrem 2012-01-17 15:43:24

+0

是否有可能“收听”arraylist,如果客户端被添加,不适当更新JList? – sindrem 2012-01-17 16:10:12

3

我应该更新什么?

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

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

第二个选项听起来更好。

+0

谢谢:)我想我不得不做一些研究 – sindrem 2012-01-17 15:44:03

3

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

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

2)环绕在执行一个Runnble#Thread,但随后所有输出到GUI必须包装成invokeLater/invokeAndWait,包括线程安全方法setText

+0

+1,适用于EDT和SwingWorker :-)问候 – 2012-01-17 16:56:30

+0

感谢您的支持。 这是你在想什么http://www.javamex.com/tutorials/threads/invokelater.shtml? – sindrem 2012-01-18 14:38:09

+0

right http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html – mKorbel 2012-01-18 16:09:03