2011-01-20 54 views
6

我已經基於ArrayList中的JComboBox:如何從ArrayList更新JComboBox內容?

private ArrayList<String> klienci = new ArrayList<String>(); 
private JComboBox klienciLista; 

,我將其添加在構造函數中:

klienciLista = new JComboBox(klienci.toArray()); 
klienciLista.setPrototypeDisplayValue("#############################"); 
panel.add(klienciLista); //JPanel panel 

在啓動列表是空的。客戶端通過插座新的ArrayList獲取線索:

public void run() { 
    try { 
    host = InetAddress.getLocalHost().getHostName(); 
    socket = new Socket(host, SERVER_PORT); 
    input = new ObjectInputStream(socket.getInputStream()); 
    output = new ObjectOutputStream(socket.getOutputStream()); 
    output.writeObject(nazwa); 
    } catch (IOException e) { 
    System.out.println(e); 
    JOptionPane.showMessageDialog(null, 
    "Polaczenie sieciowe dla klienta nie moze byc utworzone"); 
    setVisible(false); 
    dispose(); // zwolnienie zasobów graficznych 
     // okno graficzne nie zostanie utworzone 
    return; 
    } 
    try { 
    while (true) { 
    container = new Object[2]; 
    container = (Object[]) input.readObject(); 
    String m = (String) container[0]; 
    setKlienci((ArrayList<String>) container[1]); 
    klienciLista = new JComboBox(klienci.toArray()); 
    String pom = textArea.getText(); 
    textArea.setText(pom + ">>> " + m + "\n"); 
    klienciLista.revalidate(); 
    panel.revalidate(); 
    panel.repaint(); 

    if (m.equals("exit")) { 
    input.close(); 
    output.close(); 
    socket.close(); 
    setVisible(false); 
    dispose(); 
    break; 
    } 
    } 
    } catch (Exception e) { 
    System.out.println(e); 
    JOptionPane.showMessageDialog(null, 
    "Polaczenie sieciowe dla klienta zostalo przerwane"); 
    setVisible(false); 
    dispose(); 
    } 
} 

我想要做的是,我的JComboBox klienciLista填補現有客戶的新的ArrayList,但這並沒有發生。連接後,服務器發送arrayList和客戶端更新它,但不更新組合框。爲什麼是這樣?

回答

19

這是因爲您一直在循​​環中創建一個新的JComboBox,而不是更新現有的JComboBox。

而不是

while(true){ 
... 
klienciLista = new JComboBox(klienci.toArray()); 
... 
} 

做:

while(true){ 
    ... 
    klienciLista.removeAllItems(); 
    for(String s:klienci){ 
     klienciLista.addItem(s); 
    } 
    ... 
} 

,或者最好,使用一個模型:

klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray())); 
1

因爲當你做 klienciLista = new JComboBox(klienci.toArray()); 要創建一個新的JComboBox並通過該變量引用它,但的JComboBox 仍然存在在GUI中。您沒有任何操作來更改當前顯示的JComboBox。

+0

那麼我該怎麼辦? – TrN 2011-01-20 12:31:53

+1

正如已經建議的那樣,使用addItem(如果它只是添加項目並且不刪除任何項目),或者更好地使用已經由該變量引用的現有對象上的setModel,而不是重新定義該變量。 – masijade 2011-01-20 13:14:01

3

首先,您應該從ComboBoxModel創建您的JComboBox。其次,你不應該在循環中調用新的JComboBox。

0

清除和更新列表不是你的組合框。