我正在使用正确显示的JList。但是,我在从列表中删除元素时遇到问题。
JList nameList = new JList(db.getAllNames());
nameList.setVisibleRowCount(6);
nameList.setFixedCellWidth(400);
JButton removeNameButton = new JButton("Remove Name");
removeNameButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String id = nameList.getSelectedValue().toString(); //valid value when button pressed
int index = nameList.getSelectedIndex(); //valid value when value pressed
namesList.remove(index); //ERROR
}
JList包含4个名称,它们完美显示并且似乎具有正确的索引。 (如果我检查值System.out.println(copiersList.getModel().getSize());
,它总是显示4
以下是错误消息:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 3
奇怪的是,如果我删除了Adam,我就不会收到错误(但是显然列表没有改变并调用.getSize()
方法显示4):
id selected: Adam
index selected: 0
然而,任何其他:
id selected: BobException in thread "AWT-EventQueue-0"
index selected: 1
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
at java.awt.Container.remove(Unknown Source)
答案 0 :(得分:4)
不要从JList本身中删除,因为remove(...)
方法没有按照您的想法执行。它实际上是试图删除JList中保存的组件,就好像它是一个包含其他组件的JPanel,即使不存在这样的组件。而是从JList的 模型 中删除,通常是DefaultListModel。 DefaultListModel类有removeElement(Object element)
和removeElementAt(int index)
方法可以帮助您。
即,
public void actionPerformed(ActionEvent e) {
String id = nameList.getSelectedValue().toString(); //valid value when button pressed
int index = nameList.getSelectedIndex(); //valid value when value pressed
DefaultListModel listModel = (DefaultListModel) namesList.getModel();
listModel.removeElementAt(index);
}