2011-01-20 2 views
6

가 나는 JComboBox에 ArrayList를 기반으로 한 :ArrayList에서 JComboBox 내용을 업데이트하는 방법은 무엇입니까?

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

내가 생성자에 추가 : 시작 목록에서

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

가 비어 있습니다.

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를 통해 얻을 수 있습니다. 연결 후 서버는 arrayList를 보내고 클라이언트는 업데이트하지만 ComboBox는 업데이트하지 않습니다. 왜 이런거야?

답변

19

기존 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())); 
+0

어, 많은 도움이됩니다. 고마워. – TrN

+0

이 답변은 나를 도와줍니다! – Francisunoxx

4

GUI에서 업데이트하는 대신 새 JComboBox를 작성하기 때문입니다. 당신은 당신이 새로운 JComboBox의를 생성하고 그 변수를 통해 참조하는 klienciLista = new JComboBox(klienci.toArray()); 하지만 원래 JComboBox의 작업을 수행 할 때 http://download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html여전히이 존재

1

때문에 : JComboBox에에 addItem를() 메소드에서

봐 GUI에서. 현재 표시된 JComboBox를 변경하지 않았습니다.

+0

그래서 어떻게해야합니까? – TrN

+1

이미 제안 된 것처럼 addItem (항목을 추가 만하고 제거하지 않는 경우) 또는 해당 변수를 다시 정의하지 말고 해당 변수가 이미 참조한 기존 객체의 setModel을 사용하십시오. – masijade

3

먼저 ComboBoxModel에서 JComboBox를 만들어야합니다. 둘째, 루프 내부에서 새로운 JComboBox를 호출하면 안됩니다.

0

삭제 및 목록 아닌 콤보 상자 업데이트합니다.

관련 문제