2014-03-26 2 views
-1

У меня есть ArrayList of Objects (Name, несколько номеров и т. Д.), Который я могу открыть и посмотреть на JTable (имя и т. Д.). Я могу добавить объект в jtable и добавить его в arraylist. Whe Я пытаюсь удалить объект из JTable, он не удалит также и мой ArrayList. Я сделал это ActionListener и я попробовал оба метод для удаления объекта (с удалением() и с итератором)Удалить объект из Arraylist

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

Пожалуйста, следуйте соглашениям о капитализации Java. Кроме того, что такое значение 'Name', и уверены ли вы, что ваше условие if оценивает значение' true'? Вы пробовали отладчик? –

+0

Можно ли использовать 'Vector' вместо' ArrayList'? 'DefaultTableModel' имеет [конструктор для' Vector'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html#DefaultTableModel%28java.util.Vector,% 20java.util.Vector% 29), и это сделает все остальное намного проще. –

ответ

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 ...

0

, если вы хотите удалить только одну строку только

myarraylistofobjects.remove(selectedRow) ; 

    tablemodel.removeRow(table.getSelectedRow()); 

Эти две строки решить вашу проблему

Смежные вопросы