2016-07-25 24 views
0

Ich versuche, mehrere Zeilen aus einer JTable zu löschen, die vom Benutzer ausgewählt wurden. Der Code funktioniert und löscht die Zeilen mit Ausnahme einer Zeile, bei der er eine ArrayOutOfBoundsException auslöst. Der folgende Code ist der Lösch-Button.Löschen von Zeilen aus JTable - Java

public void mouseClicked(MouseEvent e) { 

      int[] rows = dataTable.getSelectedRows(); 

      if(rows.length == 0){ 
       JOptionPane.showMessageDialog(null, "No records are selected"); 
      }else if(JOptionPane.showConfirmDialog(null, "Are you sure you want to permanently delete " + 
         rows.length + " selected record(s)") == 0){ 

       for(int i = 0; i < rows.length; i++){ 
        System.out.println("Value at " + rows[i] + ": " + dataModel.getValueAt(rows[i], 0)); 

       } 

       for(int i = 0; i < rows.length; i++){ 
        System.out.println("Current Row ("+ i +"): " + rows[i]); 
        dataModel.removeRow(rows[i]); // Throws error 

       } 

        dataTable.revalidate(); 
        dataTable.repaint(); 
       } 
     } 

-Code für Datenmodell

dataModel = new DefaultTableModel() { 
     @Override 
     public boolean isCellEditable(int row, int column) { 
      return false; 
     } 
    }; 

Stacktrace

java.lang.ArrayIndexOutOfBoundsException: 3 >= 2 
at java.util.Vector.removeElementAt(Vector.java:558) 
at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:462) 
at com.company.fitness.DataPanel$4.mouseClicked(DataPanel.java:213) 
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270) 
+0

Bitte Code für 'dataModel' anzeigen – SomeDude

+0

Können Sie uns den StackTrace zeigen? – TMichelsen

+0

Eine der SO-Antworten schlägt vor, 'removeRow (rows [i] -i);' –

Antwort

0

Theoretisch müssen Sie ausgewählte Zeilen konvertieren als here

for(int i = 0; i < rows.length; i++) 
{ 
    System.out.println("Current Row ("+ i +"): " + rows[i]); 
    rows[i] = dataTable.convertRowIndexToModel(rows[i]);        
    dataModel.removeRow(rows[i]); 

} 

gebenes Modell Aber wenn yo Sie haben keine Sortierfunktion, es ist möglicherweise nicht erforderlich. Stellen Sie nur sicher, dass Sie eine Liste von Zeilen durchlaufen, die "aktuell" in der Tabelle vorhanden sind.

2

Wenn Sie ein Objekt aus dem Modell entfernen, verringert sich die Größe der Sammlung. daher wird jede Bezugnahme auf einen Gegenstand oberhalb der Größe durch eine Ausnahme erfolgen.

1

Hier ist ein einfacher Ansatz, den Sie ausgewählt Zeilen aus einer Tabelle (oder JList), indem sie nur einen Index zu einem Zeitpunkt, löschen können:

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) 
     { 
      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(); 
      } 
     }); 
    } 
} 

Es wird auch Tabellen behandeln, die sortiert wurden oder gefiltert.