2016-07-25 28 views
0

ユーザが選択したJTableから複数の行を削除しようとしています。このコードでは、行の1行を除いて行が削除され、ArrayOutOfBoundsExceptionがスローされます。以下は、削除ボタンのコードです。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(); 
       } 
     } 

コードは、データモデル

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

'dataModel'のコードを表示してください – SomeDude

+0

私たちにスタックトレースを教えてもらえますか? – TMichelsen

+0

SOの答えの1つは、 'removeRow(rows [i] -i);' –

答えて

0

理論的には、指定された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]); 

} 

しかし、もしヨーヨーのようにモデル化するために、選択した行を変換する必要がありますあなたはソート機能を持っていないので、必要ではないかもしれません。 "現在"テーブルに存在する行のリストをループしていることを確認してください。

2

モデルをアイテムから削除すると、コレクションのサイズが小さくなります。したがって、サイズを超えるアイテムへの参照は例外を介して行われます。ここで

1

では、一度に一つだけのインデックスを取得することによって、テーブル(またはJListの)から選択された行を削除することができます簡単なアプローチです:

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

また、ソートされているテーブルを処理しますか、フィルタリングされる。

関連する問題