ComboBox仅在重新启动时更新,Java

时间:2017-12-22 17:57:26

标签: java combobox

我正在开展一个小型宠物项目,我的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();
    }
});

1 个答案:

答案 0 :(得分:0)

自己想出来,我需要将默认模型更新为arraylist,就像这样

comboBox.setModel(new DefaultComboBoxModel<Item>(itemList.toArray(new Item[itemList.size()])));
                    comboBox.getParent().validate();