如何从ArrayList更新JComboBox内容?

我有基于ArrayList的JComboBox:

private ArrayList klienci = new ArrayList(); private JComboBox klienciLista; 

我在构造函数中添加它:

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

在开始时列表为空。 客户端通过线程中的socket new 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) 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,客户端更新它,但不更新ComboBox。 为什么是这样?

这是因为你在循环中不断创建一个新的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())); 

这是因为您正在创建一个新的JComboBox而不是更新GUI上的那个。

查看JComboBox上的addItem()方法: http : //download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html

首先,您应该从ComboBoxModel创建JComboBox。 其次,你不应该在循环中调用新的JComboBox。

因为当你做klienciLista = new JComboBox(klienci.toArray()); 您正在创建一个新的JComboBox并通过该变量引用它,但原始的 JComboBox 仍然存在于GUI中。 您没有做任何事情来更改当前显示的JComboBox。

清除并更新您的列表而不是您的comboBox。