2015-04-23 5 views
0

У меня есть JTable, который включает в себя элементы из ArrayList, однако всякий раз, когда я пытаюсь удалить содержимое удаленной строки из ArrayList я получаю IndexOutOfBoundsException в зависимости от количества строк, я хотел, чтобы удалить и их местоположение. Как мне решить эту проблему?Удаление элементов из ArrayList через JTable

Runnable Код: http://pastebin.com/Nnrnxzdg

remove.addActionListener(e -> { 
    int k = 0; 
    int[] rows = table.getSelectedRows(); 
    TableModel tm= table.getModel(); 
    while(rows.length>0) 
    { 
     while(k<rows.length) 
     { 
      al.remove(table.getSelectedRow() + k); 
      k++; 
     } 
     ((DefaultTableModel)tm).removeRow(table.convertRowIndexToModel(rows[0])); 

     rows = table.getSelectedRows(); 
    } 
    table.clearSelection(); 
}); 
+1

Рассмотрите возможность использования [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+1

индекс от al.remove <> tm.emoveRow, странно удалять один и тот же элемент из двух разных массивов, использовать массив в качестве основных данных для применения (абстрактная модель с реализованным массивом) или использовать tablemodel as основные данные – mKorbel

ответ

3

В основном, момент, когда вы удалите строки, все индексы изменяются. Так что вам нужно сделать, это сделать копию всех выбранных строк, но не показатель, но фактическое значение строки ...

JTable table = getTable(); 
if (table.getSelectedRowCount() > 0) { 
    List<Vector> selectedRows = new ArrayList<>(25); 
    DefaultTableModel model = getModel(); 
    Vector rowData = model.getDataVector(); 
    for (int row : table.getSelectedRows()) { 
     int modelRow = table.convertRowIndexToModel(row); 
     Vector rowValue = (Vector) rowData.get(modelRow); 
     selectedRows.add(rowValue); 
    } 

Теперь с этим, вы можете вычислить indexOf любой заданный объект с модель и снять ее ...

for (Vector rowValue : selectedRows) { 
     int rowIndex = rowData.indexOf(rowValue); 
     model.removeRow(rowIndex); 
    } 
} 

не заботясь о том, какой индекс значения был.

+0

Хорошее решение общего назначения для DefaultTableModel, которое будет работать для отсортированных и отфильтрованных таблиц (+1). – camickr

3

Индексы изменяются, если вы удаляете строки с начала модели.

Одним из решений является удаление одной строки в то время, десять все выбранные индексы сбрасываются, так что вы всегда извлекать правильный индекс:

Ниже приведен пример, показывающий, как вы могли бы сделать это для JList и а JTable:

import java.awt.*; 
import java.awt.event.*; 
import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.swing.*; 
import javax.swing.table.*; 

public class ItemDeletion extends JPanel 
{ 
    private JList<String> list; 
    private JTable table; 

    public ItemDeletion() 
    { 
     setLayout(new BorderLayout(5, 5)); 

     String[] items = 
     { 
      "One", 
      "Two", 
      "Three", 
      "Four", 
      "Five", 
      "Six", 
      "Seven", 
      "Eight", 
      "Nine", 
      "Ten" 
     }; 

     // Add the list 

     DefaultListModel<String> listModel = new DefaultListModel<String>(); 

     for (String item: items) 
      listModel.addElement(item); 

     list = new JList<String>(listModel); 


     JButton listDelete = new JButton("Delete From List"); 
     listDelete.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       DefaultListModel model = (DefaultListModel)list.getModel(); 
       int row = list.getSelectedIndex(); 

       while (row != -1) 
       { 
        model.removeElementAt(row); 
        row = list.getSelectedIndex(); 
       } 
      } 
     }); 

     JPanel listPanel = new JPanel(new BorderLayout(5, 5)); 
     listPanel.add(new JScrollPane(list), BorderLayout.CENTER); 
     listPanel.add(listDelete, BorderLayout.PAGE_END); 

     // Add the table 

     DefaultTableModel tableModel = new DefaultTableModel(0, 1); 
     List<String> tableItems = Arrays.asList(items); 
     Collections.shuffle(tableItems); 

     for (String item: tableItems) 
     { 
      System.out.println(item); 
      tableModel.addRow(new String[]{item}); 
     } 

     table = new JTable(tableModel); 

     table.setAutoCreateRowSorter(true); 
     ((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0); 

     JButton tableDelete = new JButton("Delete From Table"); 
     tableDelete.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       DefaultTableModel model = (DefaultTableModel)table.getModel(); 
       int row = table.getSelectedRow(); 

       while (row != -1) 
       { 
        int modelRow = table.convertRowIndexToModel(row); 
        model.removeRow(modelRow); 
        row = table.getSelectedRow(); 
       } 
      } 
     }); 

     JPanel tablePanel = new JPanel(new BorderLayout(5, 5)); 
     tablePanel.add(new JScrollPane(table), BorderLayout.CENTER); 
     tablePanel.add(tableDelete, BorderLayout.PAGE_END); 

     add(listPanel, BorderLayout.LINE_START); 
     add(tablePanel, BorderLayout.LINE_END); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Multiple Item Deletion"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ItemDeletion(), BorderLayout.NORTH); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

Реверсирование индексов будет моим другим предложением +1 – MadProgrammer

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

  • Нет связанных вопросов^_^