Как обновить содержимое JComboBox из ArrayList?

У меня есть JComboBox на основе ArrayList:

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 заполнялся новым списком доступных клиентов ArrayList, но этого не происходит. После подключения сервер отправляет arrayList, и клиент обновляет его, но не обновляет ComboBox. Почему это?


person TrN    schedule 20.01.2011    source источник


Ответы (5)


Это потому, что вы продолжаете создавать новый JComboBox в своем цикле вместо обновления существующего.

Вместо

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

do:

while(true){
    ...
    klienciLista.removeAllItems();
    for(String s:klienci){
        klienciLista.addItem(s);
    }
    ...
}

или, предпочтительнее, используйте модель:

    klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray()));
person dogbane    schedule 20.01.2011
comment
Этот ответ поможет мне! - person Francisunoxx; 30.09.2016

Это связано с тем, что вы создаете новый JComboBox, а не обновляете его в графическом интерфейсе.

Посмотрите на метод addItem() в JComboBox: http://download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html

person jzd    schedule 20.01.2011

Во-первых, вы должны создать JComboBox из ComboBoxModel. Во-вторых, вы не должны вызывать новый JComboBox внутри цикла.

person adrianboimvaser    schedule 20.01.2011

Потому что, когда вы делаете klienciLista = new JComboBox(klienci.toArray());, вы создаете новый JComboBox и ссылаетесь на него через эту переменную, но исходный JComboBox все еще существует в графическом интерфейсе. Вы ничего не сделали, чтобы изменить JComboBox, который отображается в данный момент.

person masijade    schedule 20.01.2011
comment
Как уже было предложено, используйте addItem (если он только добавляет элементы, а не удаляет их) или лучше setModel для существующего объекта, на который уже ссылается эта переменная, а не переопределение этой переменной. - person masijade; 20.01.2011

Очистите и обновите свой список, а не свой comboBox.

person noob    schedule 26.06.2013