将项添加到JList会删除所有其他项

时间:2013-05-23 16:06:51

标签: java swing file-io jlist

我需要一些关于向JList添加项目的帮助。我在一些“图书馆”类项目上工作。我需要将读者添加到现有的JList中。但是当我尝试添加它时,JList只会重置,删除所有读者并开始将读者添加到新的空白JList中。但我不需要它来制作新的列表,而是将其添加到现有的列表中。

这是我的代码:

listCtenaru = new JList(vector);
vector = new Vector<String>();

    FileInputStream fos = new FileInputStream("myjlist.bin");
    ObjectInputStream oss = new ObjectInputStream(fos);
    listCtenaru = (JList)oss.readObject();

    listScroll = new JScrollPane();
    listScroll.add(listCtenaru);

和动作监听器事件

public void actionPerformed(ActionEvent e) {
       String jmeno = pole1.getText();
       String prijmeni = pole2.getText();

       listCtenaru.setListData(vector);
       vector.addElement(jmeno +" "+ prijmeni);

       pole1.setText("");
       pole2.setText("");

       pole1.requestFocus();

2 个答案:

答案 0 :(得分:1)

每次添加阅读器并将其设置在JList上时,您似乎正在创建新模型。

我认为使用更灵活且适合您的JList的ListModel会更好。请参阅Java教程:http://docs.oracle.com/javase/tutorial/uiswing/components/list.html

这是JList.setListData(vector)的javadoc:

  

从项目数组和调用构造一个只读ListModel   使用此模型的setModel。尝试将null值传递给此值   方法导致未定义的行为,并且很可能导致异常。该   创建的模型直接引用给定的数组。试图修改   调用此方法后的数组会导致未定义的行为。

它声明在调用setListData()之后你不能修改向量,这正是你在这里所做的。

答案 1 :(得分:1)

要添加和删除列表中的项目,您可以使用ListModel

// To create:
DefaultListModel model = new DefaultListModel();
for(Object item : (Object[])ois.readObject()) {
   model.addElement(item);
}
JList list = new JList(model);

// To add:
model.addElement("New element");

// To save:
oos.writeObject(model.toArray());

顺便提一下,序列化整个Swing组件(如JList)通常是个坏主意。相反,您应该只是序列化其中的数据。