View Full Version : [Java] Problema con il cast
Ciao a tutti!
Non riesco a capire perché eseguendo l'istruzione
DefaultTableModel model = (DefaultTableModel) table.getModel();
Mi lancia l'eccezione:
javax.swing.JTable$1 cannot be cast to javax.swing.table.DefaultTableModel
Il metodo table.getModel() dovrebbe restituire un TableModel ma se vado a vedere che tipo di classe mi ritorna table.getModel() mi ritorna una JTable :confused: :confused: :confused:
Perché fa così? Ho visto diverse soluzioni su Internet che dicono che se voglio serializzare una tabella, devo serializzare il suo "modello" (in quanto JTable non è serializzabile); tutte le soluzioni dicono di fare così.
Il problema l'ho risolto parzialmente scrivendo così:
DefaultTableModel model = new DefaultTableModel(data, columnNames); // data e columnames sono i dati e le colonne che stanno nella JTable
saveResults(DBopen + ".Clustering",model); //salva l'oggetto model su file
Dico parzialmente perché come va a scrivere su file l'oggetto model mi lancia ora questa eccezione:
java.io.NotSerializableException: sun.swing.table.DefaultTableCellHeaderRenderer$EmptyIcon
Ma DefaultTableModel non è serializzabile? :confused:
Mistero! Ora funziona :confused:
Non ho fatto assolutamente niente.
Va bene. Grazie lo stesso.
Aggiornamento:
Ora funziona come già avevo specificato prima. Solo che fa un comportamento strano. Nel senso la funzione è fatta in modo tale che crea un DefaultTableModel model nuovo se non c'è un certo file sull'hard disk, altrimenti lo carica da tale file e poi visualizza a schermo (in un frame) la tabella. Il problema si presenta solo quando il file già esiste (quindi deve caricare l'oggetto salvato su file), nel senso che mi apre due finestre con la tabella invece che una sola. Non capisco perché. Di seguito posto il codice della funzione:
private void createCFResults(double[] cf, int[] vicini, int numutenti, boolean exists){
Container c = new Container();
c.setLayout(new BorderLayout());
JTable table = null;
JFrame stframe = new JFrame("Clustering Coefficient");
JLabel labcfmedio = new JLabel("Clustering Coefficient della rete: ");
JLabel cfmedio = new JLabel();
JPanel tablepanel = new JPanel();
JPanel labelpanel = new JPanel();
DefaultTableModel model = null;
if(!exists){
String[] columnNames = {"Nodo","Vicini","Clustering Coefficient"};
Vector[][] data = new Vector[numutenti][3];
double sumcf = 0;
for(int i=0; i<numutenti; ++i){
data[i] = new Vector[3];
for(int j=0; j<3; ++j){
data[i][j] = new Vector();
if(j==0)
data[i][j].add(i);
else if(j==1)
data[i][j].add(vicini[i]);
else if(j==2){
BigDecimal d = new BigDecimal(cf[i],new MathContext(5));
double val = d.doubleValue();
data[i][j].add(val);
sumcf+=val;
}
}
}
cfmedio.setText((String.valueOf(sumcf/=numutenti)));
model = new DefaultTableModel(data, columnNames);
saveResults(DBopen + ".Clustering",model);
}
else{
model = (DefaultTableModel) openResults(DBopen + ".Clustering");
}
table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
tablepanel.add(scrollPane);
labelpanel.add(labcfmedio);
labelpanel.add(cfmedio);
c.add(tablepanel,BorderLayout.CENTER);
c.add(labelpanel,BorderLayout.SOUTH);
stframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
stframe.getContentPane().add(c);
stframe.pack();
stframe.setVisible(true);
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.