Dae pessoal!
Bom… andei estudando bastante a parte de JDBC do Java. Depois de apanhar um pouquinho, tava trabalhando legal com a ponte JDBC:ODBC, entre java e access. Fiz uma aplicação, e como deu certo fiquei bastante animado.
Então resolvi ir pra um DB mais interessante que Access. No site do NetBeans (www.netbeans.org) tem uns tutos legais de interface gráfica e associação com BD Derby. Fiz o tuto da parte de GUI, bem fácil, baixei o Derby, instalei, configurei, gerei meu DB com uma tabela Contatos de teste, tudo certinho.
Desenvolvi a aplicação deste tutorial:
http://www.netbeans.org/kb/50/gui-database.html
A Aplicação compila perfeitamente; Ta tudo certinho. No entanto não consigo me livrar dessa maldita Exception, e acaba que a aplicação não funciona!
java.sql.SQLException: Invalid state
at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
at com.sun.rowset.JdbcRowSetImpl.beforeFirst(JdbcRowSetImpl.java:1879)
at Meu.ContatoAoEditor.RowSetTableModel.updateRowCount(RowSetTableModel.java:168)
at Meu.ContatoAoEditor.RowSetTableModel.setRowSet(RowSetTableModel.java:138)
at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:78)
at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
at javax.swing.JTable.addColumn(JTable.java:1984)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
at javax.swing.JTable.tableChanged(JTable.java:3009)
at javax.swing.JTable.setModel(JTable.java:2878)
at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
at javax.swing.JTable.addColumn(JTable.java:1984)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
at javax.swing.JTable.tableChanged(JTable.java:3009)
at javax.swing.JTable.setModel(JTable.java:2878)
at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
java.sql.SQLException: Invalid state
at com.sun.rowset.JdbcRowSetImpl.checkState(JdbcRowSetImpl.java:504)
at com.sun.rowset.JdbcRowSetImpl.getMetaData(JdbcRowSetImpl.java:1617)
at Meu.ContatoAoEditor.RowSetTableModel.findColumnIndex(RowSetTableModel.java:102)
at Meu.ContatoAoEditor.RowSetTableModel.getColumnName(RowSetTableModel.java:59)
at javax.swing.JTable.addColumn(JTable.java:1984)
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1000)
at javax.swing.JTable.tableChanged(JTable.java:3009)
at javax.swing.JTable.setModel(JTable.java:2878)
at Meu.ContatoAoEditor.ContateOEditor.initComponents(ContateOEditor.java:303)
at Meu.ContatoAoEditor.ContateOEditor.<init>(ContateOEditor.java:17)
at Meu.ContatoAoEditor.ContateOEditor$15.run(ContateOEditor.java:483)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Realmente não sei o que fazer, principalmente porque sou iniciante. Quanto trabalhei JDBC:ODBC, a parte Model-Controller da aplicação eu que tinha feito, na mão… então tava bem mais facil. Mas nesse caso… a parte da inserção no banco ja veio pronta =\ A ideia do tuto era mostrar como integrar a GUI com o Banco. E acabou que eu não consegui entender o que está causando essa exceção. Ai vai o fonte do arquivo que tá gerando a Exception:
package Meu.ContatoAoEditor;
import java.sql.*;
import java.util.*;
import javax.sql.*;
import javax.swing.table.AbstractTableModel;
/**
* TableModel adapter for a RowSet.
*
* @author Jan Stola
*/
public class RowSetTableModel extends AbstractTableModel implements RowSetListener {
// RowSet with the data
private RowSet rowSet;
// Number of rows
private int rowCount;
// Columns visible in the table model
private String[] visibleColumns;
/**
* Returns number of rows in the table.
*
* @return number of rows in the table.
*/
public int getRowCount() {
return rowCount;
}
/**
* Returns number of columns in the table.
*
* @return number of columns in the table.
*/
public int getColumnCount() {
int columnCount = 0;
try {
if (visibleColumns != null) {
columnCount = visibleColumns.length;
} else if (rowSet != null) {
columnCount = rowSet.getMetaData().getColumnCount();
}
} catch (SQLException sqlex) {
sqlex.printStackTrace();
}
return columnCount;
}
/**
* Returns label of the specified column (can be set for example
* via <code>select column as columnLabel ...</code>).
*
* @return name of the specified column.
*/
public String getColumnName(int column) {
String name = super.getColumnName(column);
if (visibleColumns != null) {
name = visibleColumns[column].toUpperCase();
column = findColumnIndex(visibleColumns[column]);
}
if (column != -1) {
try {
name = rowSet.getMetaData().getColumnLabel(column+1);
} catch (SQLException sqlex) {
sqlex.printStackTrace();
}
}
return name;
}
/**
* Returns value at the specified row and column.
*
* @return value at the specified row and column.
*/
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
try {
rowSet.absolute(rowIndex+1);
if (visibleColumns != null) {
columnIndex = findColumnIndex(visibleColumns[columnIndex]);
}
if (columnIndex != -1) {
value = rowSet.getObject(columnIndex+1);
}
} catch (SQLException sqlex) {
sqlex.printStackTrace();
}
return value;
}
// Helper method used when <code>visibleColumns</code> property is set.
// Transforms columnName into index of the column in the model.
private Map columnToIndexMap = new HashMap();
private int findColumnIndex(String columnName) {
columnName = columnName.toUpperCase();
Integer index = (Integer)columnToIndexMap.get(columnName);
if (index != null) return index.intValue();
int columnIndex = -1;
if (rowSet != null) {
try {
ResultSetMetaData metaData = rowSet.getMetaData();
int columns = metaData.getColumnCount();
for (int i=1; i<=columns; i++) {
if (metaData.getColumnName(i).toUpperCase().equals(columnName)) {
columnIndex = i-1;
break;
}
}
} catch (SQLException sqlex) {
sqlex.printStackTrace();
}
}
return columnIndex;
}
/**
* Getter for the <code>rowSet</code> property.
*
* @return row set used by this model.
*/
public RowSet getRowSet() {
return rowSet;
}
/**
* Setter for the <code>rowSet</code> property.
*
* @param rowSet row set with the data.
*/
public void setRowSet(RowSet rowSet) {
if (this.rowSet != null) {
this.rowSet.removeRowSetListener(this);
}
this.rowSet = rowSet;
columnToIndexMap.clear();
rowSet.addRowSetListener(this);
updateRowCount();
fireTableStructureChanged();
}
/**
* Getter for the <code>visibleColumns</code> property.
*
* @return columns visible in the table model or <code>null</code>
* if all columns of the row set should be visible.
*/
public String[] getVisibleColumns() {
return visibleColumns;
}
/**
* Setter for the <code>visibleColumns</code> property.
*
* @param columns visible in the table model or <code>null</code>
* if all columns of the row set should be visible.
*/
public void setVisibleColumns(String[] visibleColumns) {
this.visibleColumns = visibleColumns;
columnToIndexMap.clear();
fireTableStructureChanged();
}
// Helper method that updates <code>rowCount</code> field.
private void updateRowCount() {
int rowCount = 0;
try {
rowSet.beforeFirst();
while (rowSet.next()) rowCount++;
} catch (SQLException sqlex) {
sqlex.printStackTrace();
}
this.rowCount = rowCount;
}
// Implementation of RowSetListener
public void rowSetChanged(RowSetEvent event) {
updateRowCount();
fireTableStructureChanged();
}
public void rowChanged(RowSetEvent event) {
updateRowCount();
fireTableDataChanged();
}
public void cursorMoved(RowSetEvent event) {}
}
Como eu disse, é o código do tutorial.
Qualquer dica é bem vinda.
Muito obrigado a todos!
Douglas Vargas