web-dev-qa-db-ja.com

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は更新しません。どうしてこれなの?

7
TrN

これは、既存の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()));
20
dogbane

これは、GUIでJComboBoxを更新するのではなく、新しいJComboBoxを作成しているためです。

JComboBoxのaddItem()メソッドを見てください: http://download.Oracle.com/javase/6/docs/api/javax/swing/JComboBox.html

4
jzd

まず、ComboBoxModelからJComboBoxを作成する必要があります。次に、ループ内で新しいJComboBoxを呼び出すべきではありません。

3
adrianboimvaser

klienciLista = new JComboBox(klienci.toArray());を実行すると、新しいJComboBoxが作成され、その変数を介して参照されますが、original JComboBox stillがGUIに存在するためです。現在表示されているJComboBoxを変更するために何もしていません。

1
masijade

コンボボックスではなく、リストをクリアして更新します。

0
noob