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