JTable java.lang.ArrayIndexOutOfBoundsException 中的错误:7 >= 7
Error in JTable java.lang.ArrayIndexOutOfBoundsException: 7 >= 7
我的 JTable 连接到数据库时遇到问题。只要我添加、删除或修改任何数据,table 就会正确更改。但是,在使用 Table 的过滤器搜索器之后,当我尝试添加某些内容时,table 不会显示它,直到我进行另一次搜索。更新按钮是唯一有效的。
将数据库添加到 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.run(RepaintManager.java:865)
at java.desktop/javax.swing.RepaintManager.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.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue.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));
}
我的 JTable 连接到数据库时遇到问题。只要我添加、删除或修改任何数据,table 就会正确更改。但是,在使用 Table 的过滤器搜索器之后,当我尝试添加某些内容时,table 不会显示它,直到我进行另一次搜索。更新按钮是唯一有效的。
将数据库添加到 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.run(RepaintManager.java:865)
at java.desktop/javax.swing.RepaintManager.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.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue.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));
}