2011-01-20 102 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

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