如何从 ArrayList 更新 JComboBox 内容?
Posted
技术标签:
【中文标题】如何从 ArrayList 更新 JComboBox 内容?【英文标题】:How to update JComboBox content from ArrayList? 【发布时间】: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。这是为什么呢?
【问题讨论】:
【参考方案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】:清除和更新您的列表,而不是您的组合框。
【讨论】:
以上是关于如何从 ArrayList 更新 JComboBox 内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用过滤的 RecyclerView 和 OnClickListener 从 ArrayList 中删除项目