0

我有一个列出arrayList 的JList。当我按下名为 delete 的按钮时,我想从列表中删除选定的元素(最好是数组列表)。目前我有以下代码,但是它不起作用。我的意思是,如果选择了一个元素,它似乎什么都不做,并且当什么都没有选择时它给了我一个 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

4 回答 4

4

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

于 2012-04-30T21:47:59.610 回答
3

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

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

您需要使用ListModelfor 删除选定的元素。

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

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

您需要实现自己的ListModel扩展javax.swing.AbstractListModelfor put CRUD 方法。

于 2012-04-30T21:49:32.980 回答
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 设置列表的模型

于 2012-04-30T21:56:58.310 回答