Java 如何从ArrayList更新JComboBox内容?

Java 如何从ArrayList更新JComboBox内容?,java,swing,arraylist,jcombobox,Java,Swing,Arraylist,Jcombobox,我有基于ArrayList的JComboBox: private ArrayList<String> klienci = new ArrayList<String>(); private JComboBox klienciLista; 开始时,列表为空。客户端通过套接字获取线程中的新ArrayList: public void run() { try { host = InetAddress.getLocalHost().getHostName(); s

我有基于ArrayList的JComboBox:

private ArrayList<String> klienci = new ArrayList<String>();
private JComboBox klienciLista;
开始时,列表为空。客户端通过套接字获取线程中的新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();
  }
 }
public void run(){
试一试{
host=InetAddress.getLocalHost().getHostName();
套接字=新套接字(主机、服务器\端口);
输入=新的ObjectInputStream(socket.getInputStream());
output=newObjectOutputStream(socket.getOutputStream());
output.writeObject(nazwa);
}捕获(IOE异常){
系统输出打印ln(e);
JOptionPane.showMessageDialog(null,
“Polaczenie sieciowe dla klienta nie moze byc utworzone”);
setVisible(假);
dispose();//Zwolninie zasobów graficznych
//奥克诺·格拉菲茨尼·佐斯坦尼·乌特沃宗
返回;
}
试一试{
while(true){
容器=新对象[2];
container=(Object[])input.readObject();
字符串m=(字符串)容器[0];
setKlienci((ArrayList)容器[1]);
klienciLista=newjcombobox(klienci.toArray());
字符串pom=textArea.getText();
textArea.setText(pom+“>>>”+m+“\n”);
klienciLista.revalidate();
panel.revalidate();
panel.repaint();
如果(m等于(“退出”)){
input.close();
output.close();
socket.close();
setVisible(假);
处置();
打破
}
}
}捕获(例外e){
系统输出打印ln(e);
JOptionPane.showMessageDialog(null,
“Polaczenie sieciowe dla klienta zostalo przerwane”);
setVisible(假);
处置();
}
}

我想做的是用可用客户机的新ArrayList填充我的JComboxKliencilista,但这不会发生。连接后,服务器发送arrayList,客户端更新它,但不更新ComboBox。这是为什么?

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

查看JComboBox上的addItem()方法:

,因为当您
klienciLista=newjcombobox(klienci.toArray())

您正在创建一个新的JComboBox并通过该变量引用它,但是原始的JComboBox仍然存在于GUI中。您尚未更改当前显示的JComboBox。

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

这是因为您在循环中不断创建新的JComboBox,而不是更新现有的JComboBox

而不是

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

或者,最好使用以下型号:

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

清除并更新列表,而不是组合框。

如前所述,在该变量已引用的现有对象上使用addItem(如果它只是添加项,而不是删除任何项)或更好的setModel,而不是重新定义该变量。此答案帮助我!
while(true){
    ...
    klienciLista.removeAllItems();
    for(String s:klienci){
        klienciLista.addItem(s);
    }
    ...
}
    klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray()));