JTable中的错误java.lang.ArrayIndexOutOfBoundsException:7> = 7

问题描述

我的JTable连接到数据库时遇到麻烦。一旦添加删除修改任何数据,表格就会正确更改。但是,在使用表格的过滤器搜索器后,当我尝试添加某些内容时,表格直到我再次进行搜索时才显示。更新按钮是唯一可用的按钮。

数据库添加到JTable并在进行更改时对其进行更新的代码

public void show_database(){
        try {
               Class.forName("com.MysqL.cj.jdbc.Driver");
               cn = (Connection)DriverManager.getConnection("jdbc:MysqL://localhost:3306/modificar?zeroDateTimeBehavior=CONVERT_TO_NULL","root","");
               pst = (PreparedStatement)cn.prepareStatement("SELECT * FROM person");
               rs = pst.executeQuery();
               table.setModel(dbutils.resultSetToTableModel(rs));
               
        } catch (Exception e) {
            System.out.println(e);
        }
        
    }

过滤器的代码

DefaultTableModel dtm = (DefaultTableModel)table.getModel();
 tablerowsorter<DefaultTableModel> tr = new tablerowsorter<DefaultTableModel>(dtm);
 table.setRowSorter(tr);
 int column=0;
        if (combo.getSelectedItem()=="ID"){
            column = 0;
        }
        else if(combo.getSelectedItem()=="Name"){
            column = 1;
        }
        else if(combo.getSelectedItem()=="Surname"){
            column = 2;
        }
        else if(combo.getSelectedItem()=="Adress"){
            column = 3;
        }
        tr.setRowFilter(RowFilter.regexFilter(filtertxt.getText(),column));

删除代码

try {
            pst = (PreparedStatement)cn.prepareStatement("DELETE FROM person WHERE id=(?)");
            pst.setInt(1,Integer.valueOf(idtxt.getText().toLowerCase()));
            pst.executeUpdate();
            idtxt.setText("");
            JOptionPane.showMessageDialog(null,"DELETED");
        } catch (Exception e) {
        }
        show_database();

此外,当我尝试删除时,它给了我这个错误。此外,一旦我再次使用过滤器,就会显示删除的数据。

Exception in thread "AWT-EventQueue-0" java.lang.Arrayindexoutofboundsexception: 8 >= 8
    at java.base/java.util.Vector.elementAt(Vector.java:463)
    at java.desktop/javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:660)
    at java.desktop/javax.swing.JTable.getValueAt(JTable.java:2706)
    at java.desktop/javax.swing.JTable.prepareRenderer(JTable.java:5724)
    at java.desktop/javax.swing.plaf.basic.BasicTableuI.paintCell(BasicTableuI.java:2190)
    at java.desktop/javax.swing.plaf.basic.BasicTableuI.paintCells(BasicTableuI.java:2092)
    at java.desktop/javax.swing.plaf.basic.BasicTableuI.paint(BasicTableuI.java:1888)
    at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
    at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
    at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
    at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
    at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
    at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
    at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
    at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
    at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
    at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
    at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
    at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
    at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
    at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
    at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:203)
    at java.desktop/java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:124)
    at java.desktop/java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:113)
    at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:109)
    at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:101)
    at java.desktop/java.awt.EventdispatchThread.run(EventdispatchThread.java:90)

解决方法

好吧,我将其添加到过滤器的代码中即可解决:

if (filter.getText().equals("")){
           table.setRowSorter(null);
       }
       else{
           tr.setRowFilter(RowFilter.regexFilter(filter.getText(),column));
       }