如何从ArrayList中更新JComboBox内容?

9

我有一个基于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并更新客户端,但不会更新ComboBox。为什么会这样呢?

5个回答

24

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

这个答案帮了我! - Francisunoxx

4

3

首先,您应该从ComboBoxModel创建JComboBox。其次,在循环内部不应调用new JComboBox。


1
因为当你执行以下代码时: klienciLista = new JComboBox(klienci.toArray()); 你创建了一个新的JComboBox并通过该变量引用它,但是原始的JComboBox仍然存在于GUI中。你没有做任何改变当前显示的JComboBox的操作。

1
正如已经建议的那样,使用addItem(如果只是添加项目而不是删除任何项目)或更好地使用setModel在已由该变量引用的现有对象上,而不是重新定义该变量。 - masijade

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接