从Arraylist中删除一个对象

时间:2014-03-26 03:03:15

标签: java swing arraylist iterator actionlistener

我有一个对象的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
            }
        }

    }

我错过了什么? 谢谢你的帮助。

2 个答案:

答案 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());

这两行将解决您的问题