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