从JList中删除元素不起作用

时间:2012-04-30 21:44:15

标签: java swing arraylist jlist

我有一个列出arrayList的JList。当我按下名为delete的按钮时,我想从列表中删除所选元素(理想情况下是arraylist)。目前我有以下代码,但它不起作用。我的意思是,如果选择了一个元素,它似乎什么都不做,并且当没有选择任何内容时它会给我一个ArrayIndexOutOfBoundsException。

private JList listOrders = new JList(arrayList.toArray());

public void myList() {
    listOrders.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
    panelForLists.add(listOrders);
}

public void updateList() {
    listOrders.setListData(arrayList.toArray());
    listOrders.revalidate();
    listOrders.repaint();
}

public void actionPerformed(ActionEvent event) {
    if (event.getSource() == deleteItem) {
         int index = listOrders.getSelectedIndex();
            listOrders.remove(index);
           updateList();
    }
}

我认为可能是因为我必须在某处添加ListSelectionListener,但我不知道如何处理它。我已经在互联网上搜索了多年的答案,这就是我从JList oracle演示中得到的结果。

非常感谢!

4 个答案:

答案 0 :(得分:4)

您似乎正在从列表中删除该项,然后在调用updateList()时再次将其添加回来,此方法在JList上调用setListData(...)。我认为你应该摆脱那种方法。 ListModel应该保存数据,更改数据后无需在JList上调用revalidate()repaint()

答案 1 :(得分:3)

这基本上是Hovercraft Full Of Eels已经回答的问题,但是还有一些代码指针。

  1. 您确实删除并重新添加了元素,这当然没有任何效果。最简单的方法是,ArrayList可以直接用作ListModel,但这是不可能的(因为ArrayList不会触发任何事件)。您可能想要使用JList( Vector )构造函数,但之后不允许修改向量。所以你很难创建自己的ListModelDefaultListModel类可能正是您所寻找的。
  2. actionPerformed方法中的代码始终假设选择了一个元素。请注意,当未选择任何内容时,getSelectedIndex方法返回-1。您可以做的最好的事情(对于用户)是在未选择任何内容时或者选择多个元素时禁用删除按钮。这可以通过让按钮后面的操作监听列表的选择模型,并根据选择更新其启用状态来实现(如果需要,不要忘记触发PropertyChangeEvent)。如果您不使用Action备份按钮,只需根据选择直接切换按钮的启用状态。

答案 2 :(得分:2)

您需要使用ListModel删除所选元素。

int index = listOrders.getSelectedIndex();
ListModel model = listOrders.getModel();

JList在调用setListData时使用javax.swing.AbstractListModel构建模型。

您需要实现自己的ListModel扩展javax.swing.AbstractListModel以放置CRUD方法。

答案 3 :(得分:1)

您可以创建一个正确更新它的模型

class ArrayListModel<T> extends AbstractListModel{

    private final List<T> arr = new ArrayList<T>();
    public int getSize(){
        return arr.size();
    }

    public T getElementAt(int ind){
        return arr.get(ind);
    }

    public void remove(int ind){
        arr.remove();
        fireIntevalRemoved(this,ind,ind);
    }


    public void add(T obj){
        arr.add(obj);
        fireIntevalAdded(this,arr.size(),arr.size());
    }

    public void setData(List<T> list){
        int size=arr.size();
        arr.clear();
        arr.addAll(list);
        fireIntevalChanged(this,0,arr.size()>size?arr.size():size);
    }

}

并使用setModel

设置列表的模型