【问题标题】:How to update JComboBox content from ArrayList?如何从 ArrayList 更新 JComboBox 内容?
【发布时间】:2011-06-12 10:23:30
【问题描述】:

我有基于 ArrayList 的 JComboBox:

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

我将它添加到构造函数中:

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

一开始 List 是空的。客户端通过线程中的socket new 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。这是为什么呢?

【问题讨论】:

    标签: java swing arraylist jcombobox


    【解决方案1】:

    这是因为您不断在循环中创建一个新的 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()));
    

    【讨论】:

    • 这个答案对我有帮助!
    【解决方案2】:

    这是因为您正在创建一个新的 JComboBox,而不是在 GUI 上更新一个。

    查看JComboBox上的addItem()方法:http://download.oracle.com/javase/6/docs/api/javax/swing/JComboBox.html

    【讨论】:

      【解决方案3】:

      首先,您应该从 ComboBoxModel 创建 JComboBox。其次,您不应该在循环内调用 new JComboBox。

      【讨论】:

        【解决方案4】:

        因为当你这样做时 klienciLista = new JComboBox(klienci.toArray()); 您正在创建一个新的 JComboBox 并通过该变量引用它,但 original JComboBox 仍然 存在于 GUI 中。您没有对当前显示的 JComboBox 进行任何更改。

        【讨论】:

        • 正如已经建议的那样,使用 addItem(如果它只是添加项目而不删除任何项目)或更好地使用该变量已引用的现有对象上的 setModel,而不是重新定义该变量。跨度>
        【解决方案5】:

        清除和更新您的列表,而不是您的组合框。

        【讨论】:

          猜你喜欢
          • 2019-08-14
          • 2014-10-02
          • 2014-05-14
          • 1970-01-01
          • 2017-11-20
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          • 2014-04-11
          相关资源
          最近更新 更多