我正在开展一个小型宠物项目,我的ComboBox遇到了一个奇怪的问题。这部分程序的预期功能是将一个项目添加到ArrayList中,该列表填充comboBox(为此目的转换为数组),写入文件,然后再次读取文件以更新在组合框中列出。 由于我不理解的原因,它没有动态变化,并且重绘不起作用。但是,如果我关闭并重新打开程序,当构造函数反序列化已更新的文件时,它确实反映了更改。这是代码:
编辑:我尝试了revalidate方法,同样的行为继续。当程序打开时,如果我添加一个项目,它不会显示在列表中,并且程序的其余部分表现得好像我添加的项目不在那里,甚至会抛出带有尝试引用的空指针它。关闭程序并重新打开它之后,在上一次运行中添加的项目将出现在列表中,正如它应该的那样,但是删除方法不起作用,并且该项目不会被取消当前运行的程序处于活动状态时删除。
编辑2:我的comboBox的代码,以及在它们被调用的地方包含revalidate / repaint方法。我已经单独尝试了每个,以及两者,行为保持不变
JComboBox comboBox = new JComboBox(itemList.toArray(new Item[itemList.size()]));
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Item newItem = new Item();
newItem.setItemName(JOptionPane.showInputDialog("Please enter the name of the site or service this login is for."));
newItem.setUserName(JOptionPane.showInputDialog("Please enter your username for this site or service"));
newItem.setPassWord(JOptionPane.showInputDialog("Please enter the password you use for this site or service"));
itemList.add(newItem);
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(passListFile));
oos.writeObject(itemList);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(passListFile));
itemList = (ArrayList<Item>) ois.readObject();
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
comboBox.revalidate();
comboBox.repaint();
}
});
答案 0 :(得分:0)
自己想出来,我需要将默认模型更新为arraylist,就像这样
comboBox.setModel(new DefaultComboBoxModel<Item>(itemList.toArray(new Item[itemList.size()])));
comboBox.getParent().validate();