Reputation: 121
The titled exception throwing in a table when I run a method where a row might be deleted there and after that when I try to clear the table rows. Can any one explain me why is this happening? I am not an expert in java.
Exception:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Vector.java:430)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
at javax.swing.JTable.getValueAt(JTable.java:2652)
at classes.RowListener.displayRowValues(RowListener.java:40)
at classes.RowListener.valueChanged(RowListener.java:32)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194)
at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:660)
at javax.swing.JTable.tableRowsDeleted(JTable.java:4460)
at javax.swing.JTable.tableChanged(JTable.java:4363)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:245)
at javax.swing.table.DefaultTableModel.setNumRows(DefaultTableModel.java:304)
at javax.swing.table.DefaultTableModel.setRowCount(DefaultTableModel.java:322)
at saraentry.MainFace.clearTable(MainFace.java:73)
at saraentry.MainFace.jButton1ActionPerformed(MainFace.java:578)
at saraentry.MainFace.access$1200(MainFace.java:32)
at saraentry.MainFace$14.actionPerformed(MainFace.java:424)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 20 seconds)
Code:
public class MainFace extends javax.swing.JFrame {
public String selectedRaw, tColSqNum, tColJobNo, tColDecName, tColDate;
String pendingDate, getTDate;
/** Creates new form MainFace */
public MainFace() {
theme.theme();
initComponents();
newJob.setMnemonic(KeyEvent.VK_N);
setLocationRelativeTo(null);
DefaultTableModel tm = (DefaultTableModel) jTable1.getModel();
tm.setRowCount(0);
ListSelectionModel selectionModel = jTable1.getSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectionModel.addListSelectionListener(new RowListener(this));
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date Sysdate = new Date();
lblDate.setText(dateFormat.format(Sysdate));
jXDatePicker1.setFormats(dateFormat);
Jobs();
}
public void Jobs() {
try {
Connection c = DB.myConnection();
ResultSet rs = c.createStatement().executeQuery("SELECT * FROM totjobno WHERE ID='todayjob' AND date=('" + lblDate.getText().trim() + "')");
while (rs.next()) {
String x = rs.getString("TotJobNo");
lblCuJobNo.setText(x);
}
c.close();
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void clearTable() {
}
private void pendingList2(String getDate) {
try {
Connection c = DB.myConnection();
Statement s = c.createStatement();
DefaultTableModel tm33 = (DefaultTableModel) jTable1.getModel();
tm33.setRowCount(0);
ResultSet r = s.executeQuery("SELECT * FROM newjobsheet WHERE date=('" + getDate + "') ORDER BY sqNumber ");
while (r.next()) {
Vector v = new Vector();
v.addElement(r.getString("sqNumber"));
v.addElement(r.getString("date"));
v.addElement(r.getString("JobNumber"));
v.addElement(r.getString("DecName"));
tm33.addRow(v);
}
} catch (ArrayIndexOutOfBoundsException e) {
JOptionPane.showMessageDialog(this, "Press OK!!", "Error!", JOptionPane.ERROR_MESSAGE);
} catch (Exception e) {
e.printStackTrace();
}
}
private void btnAllPendingActionPerformed(java.awt.event.ActionEvent evt) {
jXDatePicker1.setDate(null);
try {
DefaultTableModel tm33 = (DefaultTableModel) jTable1.getModel();
tm33.setRowCount(0);
Connection c = DB.myConnection();
Statement s = c.createStatement();
ResultSet r = s.executeQuery("SELECT * FROM newjobsheet ORDER BY sqNumber ");
while (r.next()) {
Vector v2 = new Vector();
v2.addElement(r.getString("sqNumber"));
v2.addElement(r.getString("date"));
v2.addElement(r.getString("JobNumber"));
v2.addElement(r.getString("DecName"));
tm33.addRow(v2);
}
} catch (ArrayIndexOutOfBoundsException e) {
JOptionPane.showMessageDialog(this, "Press OK!!", "Error!", JOptionPane.ERROR_MESSAGE);
} catch (Exception e) {
e.printStackTrace();
}
}
Upvotes: 2
Views: 26995
Reputation: 9317
Please check what is going on in:
classes.RowListener.displayRowValues(RowListener.java:40) at classes.RowListener.valueChanged(RowListener.java:32) at
They seem to be your own classes.
In particular if you select any row in the table before the setRowCount(0) is called there is possibility of a selection change event being generated with either first or last index as -1.
So you should probably add check on the value of index being valid before proceeding further.
If your run following code and select second row in the table you will see selection event being fired with -1 as first index. So you should guard against same in your RowListener.
public static void main(String[] args) throws Exception
{
JTable table = new JTable();
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addColumn("A");
model.addRow(new String[]{"A"});
model.addRow(new String[]{"A"});
JFrame f = new JFrame();
f.add(table);
f.pack();
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
f.setVisible(true);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e)
{
System.out.println(e.getFirstIndex() + ":" + e.getLastIndex());
}
});
Thread.sleep(10000);
model.setRowCount(0);
}
Upvotes: 2
Reputation: 109823
1) create DefaultTableModel before you opening a Connection, and code line tm33.setRowCount(0);
should be called before Databases operations too
2) remove from try - catch block
- `DefaultTableModel tm33 = (DefaultTableModel) jTable1.getModel();`
- `tm33.setRowCount(0);`
3) add finally block to the try - catch, then in the finally shopuld be closed
Connection c = DB.myConnection();
Statement s = c.createStatement();
if query to the Databases are on short and periodical bases, then isn't required to close the Connection too,
Upvotes: 1