2011-01-20 2 views
6

ho JComboBox sulla base di ArrayList:Come aggiornare il contenuto di JComboBox da ArrayList?

private ArrayList<String> klienci = new ArrayList<String>(); 
private JComboBox klienciLista; 

e aggiungerlo nel costruttore:

klienciLista = new JComboBox(klienci.toArray()); 
klienciLista.setPrototypeDisplayValue("#############################"); 
panel.add(klienciLista); //JPanel panel 

Alla lista di partenza è vuoto. Il cliente ottiene tramite presa nuovo ArrayList in discussione:

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(); 
    } 
} 

Quello che voglio fare è che il mio JComboBox klienciLista riempia di nuovo ArrayList di client disponibili, ma questo non accade. Dopo la connessione, il server invia arrayList e gli aggiornamenti client ma non aggiorna ComboBox. Perchè è questo?

risposta

19

È perché continui a creare un nuovo JComboBox nel tuo ciclo, invece di aggiornare quello esistente.

Invece di

while(true){ 
... 
klienciLista = new JComboBox(klienci.toArray()); 
... 
} 

fare:

while(true){ 
    ... 
    klienciLista.removeAllItems(); 
    for(String s:klienci){ 
     klienciLista.addItem(s); 
    } 
    ... 
} 

o, preferibilmente , utilizzare un modello:

klienciLista.setModel(new DefaultComboBoxModel(klienci.toArray())); 
+0

uhh, mi aiuti molto. grazie. – TrN

+0

Questa risposta mi aiuta! – Francisunoxx

1

Perché quando si fa klienciLista = new JComboBox(klienci.toArray()); si sta creando un nuovo JComboBox e riferimento attraverso quella variabile, ma la originale JComboBox ancora esiste nella GUI. Non hai fatto nulla per cambiare il JComboBox che è attualmente visualizzato.

+0

quindi cosa devo fare? – TrN

+1

Come è stato già suggerito, usare l'addItem (se si tratta solo di aggiungere elementi e non rimuoverne nessuno) o meglio il setModel sull'oggetto esistente già referenziato da quella variabile piuttosto che ridefinire quella variabile. – masijade

3

In primo luogo, è necessario creare JComboBox da un ComboBoxModel. In secondo luogo, non dovresti chiamare il nuovo JComboBox all'interno del ciclo.

0

chiara e aggiornare il tuo non Inserisci il tuo comboBox.