【问题标题】:Deleting rows from JTable - Java从 JTable 中删除行 - Java
【发布时间】:2016-11-28 18:24:50
【问题描述】:

我正在尝试从用户选择的 JTable 中删除多行。代码工作并删除除一行之外的行,此时它会引发 ArrayOutOfBoundsException。以下是删除按钮的代码。

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

堆栈跟踪

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)

【问题讨论】:

标签: java swing jtable indexoutofboundsexception


【解决方案1】:

当您从模型中删除项目时,集合大小会减小。因此,任何对超过 size 的项目的引用都将通过异常。

【讨论】:

    【解决方案2】:

    这是一种简单的方法,通过一次仅获取一个索引,您可以从表(或 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();
                }
            });
        }
    }
    

    它还将处理已排序或过滤的表。

    【讨论】:

      【解决方案3】:

      理论上您需要将选定的行转换为指定的模型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]); 
      
      }
      

      但如果您没有任何排序功能,则可能不需要。只需确保您正在遍历表中“当前”存在的行列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 2012-12-01
        • 2014-08-28
        • 2011-12-22
        • 1970-01-01
        • 2023-03-04
        相关资源
        最近更新 更多