How to update JComboBox content from ArrayList?
I have JComboBox based on ArrayList:
private ArrayList<String> klienci = new ArrayList<String>();
private JComboBox klienciLista;
and I add it in constructor:
klienciLista = new JComboBox(klienci.toArray());
klienciLista.setPrototypeDisplayValue("#############################");
panel.add(klienciLista); //JPanel panel
At the start List is empty. Client gets via socket new ArrayList in thread:
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);
disp开发者_如何学Goose(); // 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();
}
}
What I want to do is that my JComboBox klienciLista fill with new ArrayList of available clients, but that does not happen. After connecting, the server sends arrayList and client updates it but doesn't update ComboBox. Why is this?
It's because you keep creating a new JComboBox in your loop, instead of updating the existing one.
Instead of
while(true){
...
klienciLista = new JComboBox(klienci.toArray());
...
}
do:
while(true){
...
klienciLista.removeAllItems();
for(String s:klienci){
klienciLista.addItem(s);
}
...
}
or, preferably, use a model:
klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray()));
This is because you are creating a new JComboBox instead of updating the one on the GUI.
Look at the addItem() method on the JComboBox: http://download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html
First, you should create you JComboBox from a ComboBoxModel. Second, you shouldn't be calling new JComboBox inside the loop.
Because when you do
klienciLista = new JComboBox(klienci.toArray());
you are creating a new JComboBox and referencing it through that variable, but the original JComboBox still exists in the GUI. You have done nothing to change the JComboBox that is currently displayed.
Clear and update your list not your comboBox.
精彩评论