簡體   English   中英

更新JList

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM