2011-01-20 15 views
6

Tôi đã JComboBox dựa trên ArrayList:Làm thế nào để cập nhật nội dung JComboBox từ ArrayList?

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

và tôi thêm nó vào constructor:

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

Tại Danh sách bắt đầu là rỗng. Khách hàng được thông qua ổ cắm ArrayList mới trong chủ đề:

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(); 
    } 
} 

Những gì tôi muốn làm là JComboBox klienciLista tôi điền với ArrayList mới của khách hàng sẵn có, nhưng điều đó không xảy ra. Sau khi kết nối, máy chủ sẽ gửi arrayList và máy khách cập nhật nó nhưng không cập nhật ComboBox. Tại sao điều này?

Trả lời

19

Đó là vì bạn tiếp tục tạo JComboBox mới trong vòng lặp của mình, thay vì cập nhật phiên bản hiện tại.

Thay vì

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

làm:

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

hay, tốt, sử dụng một mô hình:

klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray())); 
+0

uhh, bạn giúp rất nhiều. cám ơn. – TrN

+0

Câu trả lời này giúp tôi! – Francisunoxx

1

Bởi vì khi bạn làm klienciLista = new JComboBox(klienci.toArray()); bạn đang tạo một JComboBox mới và tham khảo nó qua biến đó, nhưng gốc JComboBox vẫn tồn tại trong GUI. Bạn đã không làm gì để thay đổi JComboBox hiện đang được hiển thị.

+0

vì vậy tôi nên làm gì? – TrN

+1

Như đã được đề xuất, sử dụng addItem (nếu nó chỉ thêm các mục và không loại bỏ bất kỳ) hoặc tốt hơn setModel trên đối tượng hiện có đã được tham chiếu bởi biến đó thay vì xác định lại biến đó. – masijade

3

Trước tiên, bạn nên tạo JComboBox từ ComboBoxModel. Thứ hai, bạn không nên gọi JComboBox mới bên trong vòng lặp.

0

rõ ràng và cập nhật danh sách của bạn không combobox của bạn.