繁体   English   中英

从JList删除元素不起作用

[英]Removing element from JList is not working

我有一个JList列出了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演示中得到的。

非常感谢!

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

这基本上是《气垫船充满鳗鱼》已经回答的内容,但是还有更多的代码指针。

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

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

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

当您调用setListData时, JList使用javax.swing.AbstractListModel来构建模型。

您需要实现自己的ListModel ,以便为put CRUD方法扩展javax.swing.AbstractListModel

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

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设置列表的模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM