2011-01-20 8 views
6

私は、ArrayListに基づいてするJComboBoxを持っている: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は更新しません。どうしてこれなの?

答えて

19

既存のものを更新するのではなく、ループ内に新しい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())); 
+0

ああ、助けてください。どうも。 – TrN

+0

この回答は役に立ちましたか? – Francisunoxx

1

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

+0

どうすればよいですか? – TrN

+1

既に提案されているように、addItem(項目を追加するだけで、削除しない場合)や、変数を再定義するのではなく、すでに参照されている既存のオブジェクトのsetModelを使用します。 – masijade

3

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

0

クリアをし、あなたのリストではない、あなたのコンボボックスを更新します。

関連する問題