java.lang.ArrayIndexOutOfBoundsException: -1...?

Hi all.

I have problem with seting data into JTable. I use net beans and my JTable is DefaultTableModel and when i put my TableModelListener my ActionListener-s to JButtons doesn't work.

i use this code:

class TML implements TableModelListener {

public void tableChanged(TableModelEvent e){

int row = jTable1.getEditingRow();

int column = jTable1.getEditingColumn();

TableModel model = jTable1.getModel();

if(row!=0 && column!=0){

jTextField1.setText( "row " + row + " column " +

column + " Value: " + model.getValueAt(row, column));

}

}

}

TableModel model = jTable1.getModel();

model.addTableModelListener(new TML());

this works good but when i push one button from my JButtons:

jButton6.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try { // Load the driver

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Connection c = DriverManager.getConnection

("jdbc:microsoft:sqlserver://localhost:1433;databaseName=niki;User=ektomorf;Password=niki4ko");

Statement s = c.createStatement();

// SQL code:

String sql = "SELECT * FROM events";

ResultSet out = s.executeQuery(sql);

int i=0;

TableModel model = jTable1.getModel();

for(int k=0 ; k<counter ; k++){

model.setValueAt("", k, 0);

model.setValueAt("", k, 1);

model.setValueAt("", k, 2);

model.setValueAt("", k, 3);

model.setValueAt("", k, 4);

}

while(out.next()){

int id = out.getInt("id");

String date = out.getString("date");

String hour = out.getString("hour");

String event = out.getString("event");

model.setValueAt(i+1,i,0);

model.setValueAt(date, i, 1);

model.setValueAt(hour, i, 2);

model.setValueAt(event, i, 3);

model.setValueAt(id, i, 4);

i++;

counter = i;

}

s.close(); // Also closes ResultSet

}catch(Exception ex) {

ex.printStackTrace();

}

}

i have java.lang.ArrayIndexOutOfBoundsException: -1

can you help me please?>

[2204 byte] By [niki4koa] at [2007-11-27 7:01:48]
# 1
Maybe I can.I will not unless you format and indent your code, use the code button and tell us which line in your code your stack trace points to (if any).
OleVVa at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...
# 2

That's my code whit the listeners:

public class NewJFrame extends javax.swing.JFrame {

private String date;

private String hour;

private String event;

private int counter;

/** Creates new form NewJFrame */

public NewJFrame() {

initComponents();

//*************************************************************************

//Action Listeners

//Button1 ActionListener

jButton1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

date = jTextField1.getText();

hour = jTextField2.getText();

event = jTextField4.getText();

jDialog1.setVisible(true);

if(hour.equals("")) hour="";

try {

// Load the driver

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Connection c = DriverManager.getConnection

("jdbc:microsoft:sqlserver://localhost:1433;databaseName=niki;User=ektomorf;Password=niki4ko");

Statement s = c.createStatement();

// SQL code:

String sql = "INSERT INTO events(date, hour, event) " +

"VALUES('"+date+"','"+hour+"','"+event+"')";

s.executeQuery(sql);

s.close(); // Also closes ResultSet

} catch(Exception ex) {

ex.printStackTrace();

}

}

}

);

//Button2 ActionListener

jButton2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

jTextField1.setText("");

jTextField2.setText("");

jTextField4.setText("");

}

}

);

//Button3 ActionListener

jButton3.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

String search_date = jTextField3.getText();

try { // Load the driver

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Connection c = DriverManager.getConnection

("jdbc:microsoft:sqlserver://localhost:1433;databaseName=niki;User=ektomorf;Password=niki4ko");

Statement s = c.createStatement();

// SQL code:

String sql = "SELECT * FROM events WHERE date = '"+search_date+"'";

ResultSet out = s.executeQuery(sql);

int i=0;

TableModel model = jTable1.getModel();

for(int k=0 ; k<counter ; k++){

model.setValueAt("", k, 0);

model.setValueAt("", k, 1);

model.setValueAt("", k, 2);

model.setValueAt("", k, 3);

model.setValueAt("", k, 4);

}

while(out.next()){

int id = out.getInt("id");

String date = out.getString("date");

String hour = out.getString("hour");

String event = out.getString("event");

model.setValueAt(date, i, 1);

model.setValueAt(hour, i, 2);

model.setValueAt(event, i, 3);

i++;

}

counter = i;

s.close(); // Also closes ResultSet

}catch(Exception ex) {

ex.printStackTrace();

}

}

});

//Button6 ActionListener

jButton6.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try { // Load the driver

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Connection c = DriverManager.getConnection

("jdbc:microsoft:sqlserver://localhost:1433;databaseName=niki;User=ektomorf;Password=niki4ko");

Statement s = c.createStatement();

// SQL code:

String sql = "SELECT * FROM events";

ResultSet out = s.executeQuery(sql);

int i=0;

TableModel model = jTable1.getModel();

for(int k=0 ; k><counter ; k++){

model.setValueAt("", k, 0);

model.setValueAt("", k, 1);

model.setValueAt("", k, 2);

model.setValueAt("", k, 3);

model.setValueAt("", k, 4);

}

while(out.next()){

int id = out.getInt("id");

String date = out.getString("date");

String hour = out.getString("hour");

String event = out.getString("event");

[b] line 161[/b]model.setValueAt(date, i, 1);

model.setValueAt(hour, i, 2);

model.setValueAt(event, i, 3);

i++;

}

counter = i;

s.close(); // Also closes ResultSet

}catch(Exception ex) {

ex.printStackTrace();

}

}

});

class TML implements TableModelListener {

public void tableChanged(TableModelEvent e){

int row = jTable1.getEditingRow();

int column = jTable1.getEditingColumn();

TableModel model = jTable1.getModel();

System.out.println( "row " + row + " column " + column

[b]line 184... [/b]+ " Value: " + model.getValueAt(row, column));

}

}

TableModel model = jTable1.getModel();

model.addTableModelListener(new TML());

}

***********************************************************************

and that's the error:

java.lang.ArrayIndexOutOfBoundsException: -1

at java.util.Vector.elementAt(Unknown Source)

at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)

at NewJFrame$1$TML.tableChanged(NewJFrame.java:184)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableCellUpdated(Unknown Source)

at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)

at NewJFrame$4.actionPerformed(NewJFrame.java:161)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

********************************************************

it happends when i push button6

null

Message was edited by:

niki4ko

Message was edited by:

niki4ko>

niki4koa at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...
# 3
Any ideasnull
niki4koa at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...
# 4

I'm in a class until Thursday and may not have time to look at it.

Where are you creating your JTable and your DefaultTableModel?

Are you supposed to call setValueAt() yourself? In my mind, it gets called by the Java system when the user edits a cell. Maybe it should work the other way around too. If you haven't done so already, you may want to look at a tutorial and/or code example that does something similar (and point the rest of us to it, and we may help spot where you're breaking the assumptions of the example, maybe?).

OleVVa at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...
# 5

Your row or column value that you get with

int row = jTable1.getEditingRow();

int column = jTable1.getEditingColumn();

is -1.

It seems that you should not use the getEditingRow() and getEditingCol() methods for this.

Try getting the row and column from the event object.

int row = e.getFirstRow();

int column = e.getColumn();

You might also be interested in checking e.getType():

case TableModelEvent.INSERT:

case TableModelEvent.UPDATE:

case TableModelEvent.DELETE:

tom_jansena at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...
# 6
Yes thats the answer. Whitint row = e.getFirstRow();int column = e.getColumn();everithing work perfect.Thanks a lot boys.
niki4koa at 2007-7-12 18:52:41 > top of Java-index,Java Essentials,Java Programming...