我有一个列出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演示中得到的结果。
非常感谢!
答案 0 :(得分:4)
您似乎正在从列表中删除该项,然后在调用updateList()
时再次将其添加回来,此方法在JList上调用setListData(...)
。我认为你应该摆脱那种方法。 ListModel应该保存数据,更改数据后无需在JList上调用revalidate()
或repaint()
。
答案 1 :(得分:3)
这基本上是Hovercraft Full Of Eels已经回答的问题,但是还有一些代码指针。
ArrayList
可以直接用作ListModel
,但这是不可能的(因为ArrayList
不会触发任何事件)。您可能想要使用JList( Vector )
构造函数,但之后不允许修改向量。所以你很难创建自己的ListModel
。 DefaultListModel
类可能正是您所寻找的。 li>
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
设置列表的模型