如何从ArrayList更新JComboBox内容?

时间:2011-01-20 12:18:48

标签: java swing 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,客户端更新它,但不更新ComboBox。这是为什么?

5 个答案:

答案 0 :(得分:20)

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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