Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 47
  1. #1

    [java] Ordinamento JTable

    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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao restituisce questo :

    class java.lang.Object

    sulla colonna interessata.

  4. #4
    dovrebbe essere un intero o sbaglio?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fcorsa
    ciao restituisce questo :

    class java.lang.Object

    sulla colonna interessata.

    dovrebbe essere un intero o sbaglio?
    La logica usata da TableRowSorter è:

    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.
    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.

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    [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?

  7. #7
    come si fa a citare?????

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fcorsa
    come faccio a far restituire il tipo Integer alla colonna?
    Dipende dal model ... cosa hai usato? Uno "tuo" (tipicamente si estende AbstractTableModel)? O DefaultTableModel?

    Si tratta solo di fare l'override di getColumnClass(int column)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    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;
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fcorsa
    ecco il mio model , ma è unico per tutte le tabelle che utilizzo .
    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 ...

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.