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は更新しません。どうしてこれなの?
これは、既存の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()));
これは、GUIでJComboBoxを更新するのではなく、新しいJComboBoxを作成しているためです。
JComboBoxのaddItem()メソッドを見てください: http://download.Oracle.com/javase/6/docs/api/javax/swing/JComboBox.html
まず、ComboBoxModelからJComboBoxを作成する必要があります。次に、ループ内で新しいJComboBoxを呼び出すべきではありません。
klienciLista = new JComboBox(klienci.toArray());
を実行すると、新しいJComboBoxが作成され、その変数を介して参照されますが、original JComboBox stillがGUIに存在するためです。現在表示されているJComboBoxを変更するために何もしていません。
コンボボックスではなく、リストをクリアして更新します。