Как обновить содержимое 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 klienciLista заполнялся новым ArrayList доступных клиентов, но этого не происходит. После подключения сервер отправляет arrayList и клиент обновляет его, но не обновляет ComboBox. Почему так?
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()));
Это потому, что вы создаете новый JComboBox вместо обновления одного на GUI.
посмотрите на метод addItem() в JComboBox:http://download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html
во-первых, вы должны создать JComboBox из ComboBoxModel. Во-вторых, вы не должны вызывать новый JComboBox внутри цикла.
потому что когда вы делаете
klienciLista = new JComboBox(klienci.toArray());
вы создаете новый JComboBox и ссылаетесь на него через эту переменную, но оригинал jcombobox в еще существует в GUI. Вы ничего не сделали, чтобы изменить jcombobox, который в настоящее время отображается.