我有一个对象的ArrayList(名称,一些数字等),我可以在JTable(名称等)上打开和查看。我可以在jtable中添加一个对象并将其添加到arraylist中。当我尝试从JTable中删除一个对象时,它也不会在我的ArrayList上删除。我做了这个ActionListener,我尝试了两种删除Object的方法(使用remove()和迭代器)
class ButtonRemovePersoAL implements ActionListener {
public void actionPerformed(ActionEvent e) {
int numerorows = table.getSelectedRows().length;
for(int i=0; i < numerorows ; i++ ) {
String Name = (String) table.getModel().getValueAt(table.getSelectedRow(), 0); // I search for the first case of the JTable to catch the Object to erase
for(Object object : myarraylistofobjects) {
if(Name.equals(object.getName())) {
myarraylistofobjects.remove(object);
}
}
// OR
Iterator<Object> itr = myarraylistofobjects().iterator();
while (itr.hasNext()) {
Object object = itr.next();
if (Name.equals(object.getName())) {
itr.remove();
}
}
tablemodel.removeRow(table.getSelectedRow()); // I delete finally my row from the jtable
}
}
}
我错过了什么? 谢谢你的帮助。
答案 0 :(得分:2)
让我们从这里开始......
int numerorows = table.getSelectedRows().length;
for(int i=0; i < numerorows ; i++ ) {
String Name = (String) table.getModel().getValueAt(table.getSelectedRow(), 0); // I search for the first case of the JTable to catch the Object to erase
基本上,您获得所选行的数量,但您只使用第一个选定行的索引... table.getSelectedRow()
来自JavaDocs ...
返回:
第一个选定行的索引
你应该做的是
for(int i : table.getSelectedRows()) {
将遍历每个选定的索引。
你应该避免这样做......
String Name = (String) table.getModel().getValueAt(table.getSelectedRow(), 0);
由于视图可能已排序,意味着视图索引(选定行)不会直接映射到模型行,而是应该使用
String name = (String) table.getValueAt(i, 0);
从这里开始,这一切都变得有点混乱......
当你做某事......
tablemodel.removeRow(table.getSelectedRow());
所有指数都不再有效(更不用说你不应该使用table.getSelectedRow()
)
相反,当您从ArrayList
中删除该项目时,您应该记下它,然后走TableModel
删除删除列表中的任何项目...
例如......
List<String> removedNames = new ArrayList<String>(25);
for(int i : table.getSelectedRows() ) {
String name = (String) table.getValueAt(i, 0);
removedNames.add(name);
//...
}
int index = 0;
while (index < tableModel.getRowCount()) {
Object value = tableModel.valueAt(index, 0);
if (value != null && removedNames.contains(value.toString()) {
tableModel.removeRow(index);
} else {
index++;
}
}
坦率地说。我更简单的解决方案是创建一个自定义TableModel
,从AbstractTableModel
延伸到ArrayList
...
答案 1 :(得分:0)
如果您只想删除一行
myarraylistofobjects.remove(selectedRow) ;
tablemodel.removeRow(table.getSelectedRow());
这两行将解决您的问题