ciao raga
perche quando uso:
table.setRowSorter(new TableRowSorter (model));
mi ordina cosi:
1
12
2
20
ecc..
anziche
1
2
12
20
?
ciao grazie
ciao raga
perche quando uso:
table.setRowSorter(new TableRowSorter (model));
mi ordina cosi:
1
12
2
20
ecc..
anziche
1
2
12
20
?
ciao grazie
TableRowSorter ha tutta una sua logica per stabilire come fare le comparazioni, è tutto descritto nel javadoc di questa classe.
Innanzitutto bisognerebbe vedere che tipo di dato c'è in quella colonna ma sopratutto cosa restituisce getColumnClass() del model per quella colonna.
Lo dico chiaramente: non è così banale. Precisa un po' di cose ma sopratutto leggi bene la logica che usa TableRowSorter per stabilire come fare le comparazioni.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ciao restituisce questo :
class java.lang.Object
sulla colonna interessata.
La logica usata da TableRowSorter è:Originariamente inviato da fcorsa
ciao restituisce questo :
class java.lang.Object
sulla colonna interessata.
dovrebbe essere un intero o sbaglio?
Non hai specificato sicuramente un Comparator per quella colonna (quindi non è il punto 1), il model restituisce Object.class (quindi nemmeno il punto 2), Object non implementa certo Comparable (nemmeno il punto 3), non c'è sicuramente un TableStringConverter (nemmeno il punto 4) .... rimane il punto 5.TableRowSorter uses Comparators for doing comparisons. The following defines how a Comparator is chosen for a column:
1. If a Comparator has been specified for the column by the setComparator method, use it.
2. If the column class as returned by getColumnClass is String, use the Comparator returned by Collator.getInstance().
3. If the column class implements Comparable, use a Comparator that invokes the compareTo method.
4. If a TableStringConverter has been specified, use it to convert the values to Strings and then use the Comparator returned by Collator.getInstance().
5. Otherwise use the Comparator returned by Collator.getInstance() on the results from calling toString on the objects.
Quindi TableRowSorter prende gli oggetti, se hai detto che sono degli Integer, ne ottiene una stringa e ordina con un criterio "su stringhe".
E ovviamente in tale modo 12 viene prima di 2!!
Soluzioni: o fai restituire il tipo colonna come Integer.class (Integer implementa Comparable, quindi sei nel punto 3). Oppure imponi un Comparator (punto 1) ma non credo che ti convenga.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
[CITE]
Soluzioni: o fai restituire il tipo colonna come Integer.class (Integer implementa Comparable, quindi sei nel punto 3).
[/CITE]
come faccio a far restituire il tipo Integer alla colonna?
Dipende dal model ... cosa hai usato? Uno "tuo" (tipicamente si estende AbstractTableModel)? O DefaultTableModel?Originariamente inviato da fcorsa
come faccio a far restituire il tipo Integer alla colonna?
Si tratta solo di fare l'override di getColumnClass(int column)
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ecco il mio model , ma è unico per tutte le tabelle che utilizzo .
codice:public class ModelloTabella extends AbstractTableModel { public ModelloTabella(ResultSet aResultset){ rs = aResultset; try{ rsmd = rs.getMetaData(); }catch (SQLException e){e.printStackTrace();} } public String getColumnName(int c){ try{ //metodo che setta i nomi delle colonne String str=rsmd.getColumnName(c+1); if(str.equals("mlst"))str="MLST"; if(str.equals("mlimp"))str="MLIMP"; if(str.equals("mlord"))str="MLORD"; if(str.equals("mqst"))str="MQST"; if(str.equals("mqimp"))str="MQIMP"; if(str.equals("mqord"))str="MQORD"; return str; }catch(SQLException e){e.printStackTrace(); return "";} } public int getColumnCount() { // metodo che conta le colonne try{ return rsmd.getColumnCount(); }catch(SQLException e){e.printStackTrace(); return 0;} } public int getRowCount() { //metodo che conta le righe try{ rs.last(); return rs.getRow(); }catch(SQLException e){e.printStackTrace();return 0;} } public Object getValueAt(int r, int c) { // metodo che aggiunge l'oggetto alla tabella try{ rs.absolute(r+1); return rs.getObject(c+1); }catch(SQLException e){e.printStackTrace();return null;} } private ResultSet rs; private ResultSetMetaData rsmd; }
Ci sarebbero alcune cose che sarebbero fattibili molto meglio (es. determinare il numero di righe e colonne 1 volta sola e fare restituire ai metodi getRowCount/getColumnCount solo il valore di una variabile) ma per il momento non stiamo a fare i pignoli ...Originariamente inviato da fcorsa
ecco il mio model , ma è unico per tutte le tabelle che utilizzo .
Il tuo model non ha una sua struttura dati ... perché si appoggia direttamente ai dati presi dal ResultSet.
Ora.. in AbstractTableModel il getColumnClass() è implementato per restiture fisso sempre Object.class. Tocca a te fare l'override e far ritornare un Class più appropriato. Come? Dipende ...
Se vuoi fare in modo che il tuo model sia il più generico possibile puoi usare i metadati del result set per determinare i Class da restituire. Dovresti farlo nel costruttore, visto che è lì che imposti il ResultSet. E ripeto quanto detto sopra, più determini subito dati che poi tanto sono "fissi" per quel ResultSet ... e meglio è.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet