Java JList remove() 方法抛出 ArrayOutOfBoundsException
Java JList remove() method throws an ArrayOutOfBoundsException
我使用的是正确显示的 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)
不要从 JList 本身中删除,因为 remove(...)
方法并不像您认为的那样工作。它实际上试图删除 JList 中保存的组件,就好像它是保存其他组件的 JPanel 一样,即使不存在这样的组件也是如此。而是从 JList 的 model 中移除,通常是 DefaultListModel。 DefaultListModel class 有一个 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);
}
我使用的是正确显示的 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)
不要从 JList 本身中删除,因为 remove(...)
方法并不像您认为的那样工作。它实际上试图删除 JList 中保存的组件,就好像它是保存其他组件的 JPanel 一样,即使不存在这样的组件也是如此。而是从 JList 的 model 中移除,通常是 DefaultListModel。 DefaultListModel class 有一个 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);
}