Salve, è da un paio di giorni che sto letterlamente impazzendo su questo metodo. In pratica a me serve avere una JTable in cui io possa fare doppio click nelle celle e modificarne il valore. Il problema sorge appunto nella modifica, al momento di cambiare il valore della cella il metodo setValueAt non funziona, impedendomi persino di annullare l'operazione e fare altro D:
Posto qui sotto il codice sperando che qualcuno possa dirmi dove sto sbagliando...
package adisys.server.strumenti;
codice:
package adisys.server.strumenti;
import java.sql.*;
import java.util.Formatter;
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import adisys.server.boundary.EditorPatologie;
import adisys.server.boundary.EditorPazienti;
import adisys.server.data.Database;
import adisys.server.data.Patologie;
import adisys.server.data.Pazienti;
import adisys.server.entity.Patologia;
import adisys.server.entity.Paziente;
/**
* @author Francesco
*
*/
public class ADISysTableModel extends AbstractTableModel implements TableModel {
ResultSet dati;
public ADISysTableModel(ResultSet nuoviDati)
{
dati=nuoviDati;
try {
//Trace
System.out.println("- Creazione modello tabella: \""+ dati.getMetaData().getTableName(1) +"\"");
} catch (SQLException e1) {
e1.printStackTrace();
}
}
@Override
public int getColumnCount() {
try {
return dati.getMetaData().getColumnCount();
}
catch (SQLException e) {
e.printStackTrace();
System.out.println("ERRORE: Calcolo del numero di colonne errato.");
return 0;
}
}
@Override
public int getRowCount() {
try {
//Seleziona l'ultimo elemento
dati.last();
//Restituisce l'indice dell'elemento
return (dati.getRow());
} catch (SQLException e) {
e.printStackTrace();
System.out.println("ERRORE: Calcolo del numero di righe errato. (metodo getRowCount() )");
return 0;
}
}
@Override
public Object getValueAt(int riga, int colonna) {
try {
//Sposta il cursore alla riga desiderata (con sfasamento di 1)
dati.absolute(riga+1);
//Estrae il valore nella colonna specificata e lo restituisce (con sfasamento di 1)
return dati.getObject(colonna+1);
} catch (SQLException e) {
// In caso di errore restituisce un oggetto vuoto
e.printStackTrace();
//Trace
System.out.println("ERRORE: Valore dell'elemento della tabella non valido.");
return null;
}
}
@Override
public boolean isCellEditable(int rIndex, int cIndex)
{
String tableName = "";
try {
tableName = dati.getMetaData().getTableName(1);
} catch (SQLException e) {
// Eccezione
e.printStackTrace();
}
if(tableName.equals("PAZIENTI"))
return true;
else
return false;
}
@Override
public String getColumnName(int col) {
try {
return dati.getMetaData().getColumnName(col+1);
} catch (SQLException e) {
// Eccezione
e.printStackTrace();
return "?";
}
}
public Integer getID(int riga)
{
//Ricerca colonna ID
for(int i=0; i<=getColumnCount(); i++)
if(getColumnName(i).equals("ID"))
return i;
return null;
}
/**
* Restituisce l'indice della colonna a partire dal nome della colonna ricercata
* N.B. L'indice della prima colonna è 0, l'ultimo è numeroColonne-1.
* @param Nome - Stringa con il nome della colonna
* @return -1 se la colonna non e' stata trovata, altrimenti l'indice della colonna
*/
public int getColumnIndex(String Nome)
{
for (int i=0; i<getColumnCount();i++)
if( getColumnName(i)==Nome) return i;
return -1;
}
Vector<Paziente> content;
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex)
{
Paziente row = this.content.elementAt(rowIndex);
String strValue = (String)value;
int IDValue = (int)value;
if(columnIndex == 0)
{
row.setID(IDValue);
}
else
System.out.println("COL:" + columnIndex);
if(columnIndex == 1)
{
row.setNome("TEST");
}
else if(columnIndex == 2)
{
row.setCognome(strValue);
}
fireTableCellUpdated(rowIndex, columnIndex);
}
}
Ho già effettuato un test con il debugger di Eclipse per capire perchè arrivato a quel punto il programma si bloccava e ho scoperto che l'errore è causato da questa istruzione qui
codice:
Paziente row = this.content.elementAt(rowIndex);
La cosa che non capisco è perchè la prende come NULL, visto che l'oggetto da inserire (value), rowIndex e columnIndex, stando al debug sono passati correttamente...
Se c'è bisogno che posti altre classi non esitate a chiedere