Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Jtable setAutoCreateRowSorter

    Ciao a tutti.
    Ho implementato una Jtable contenente delle colonne che si dovrebbero ordinare cliccandoci sopra...
    per fare ciò ho settato AutoCreateRowSorter a true...
    Ora ; in una colonna ho una serie di righe contenenti ciascuna dei numeri progressivi : 1 , 2 , 3 .... 10 , 11 ecc..
    ho 30 righe quindi i numeri sono arrivati a 30.
    quando clicco sulla colonna per ordinarli , essi si ordinano in base alla prima cifra del numero , cioè ci sono prima quelli che hanno come prima cifra 1 ossia 12 , 15 , 17... poi quello che hanno come prima cifra 2 eccetera.
    Come faccio ad impostare l'ordine normalmente?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    quando clicco sulla colonna per ordinarli , essi si ordinano in base alla prima cifra del numero , cioè ci sono prima quelli che hanno come prima cifra 1 ossia 12 , 15 , 17... poi quello che hanno come prima cifra 2 eccetera.
    Come faccio ad impostare l'ordine normalmente?
    Presumo che siano dei String ... se fossero dei Integer, il row sorter predefinito dovrebbe (vado a mente, dovrei verificare) ordinare correttamente per "numero" come vuoi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo una cosa, ho riletto adesso il tutorial ufficiale (Sorting and Filtering di How to Use Tables) che effettivamente è un pochino più chiaro rispetto al javadoc di TableRowSorter.

    Se si vuole che il sorting applichi la regola 3: "If the column class returned by TableModel.getColumnClass implements Comparable, use a comparator that sorts the strings based on the values returned by Comparable.compareTo."

    è necessario non solo che gli oggetti siano effettivamente degli Integer ma anche che il Class fornito dal model per quella colonna sia Integer.class. Perché Integer implementa Comparable.

    Se si usa DefaultTableModel o si estende AbstractTableModel senza ridefinire getColumnClass (o comunque rifacendo restituire Object.class per quella colonna) e non si fa altro di particolare, si cade nella regola 5: "If none of the previous rules apply, use a comparator that invokes toString on the column data and sorts the resulting strings based on the current locale.". Object infatti non è ovviamente Comparable.

    Quindi anche avendo oggetti Integer, farebbe invocare toString() e ordinerebbe le stringhe. Ovviamente non è questo che serve per l'ordinamento numerico.


    P.S. avere il Integer.class per la colonna ha anche un altro risvolto (positivo o negativo in base ai gusti e necessità): viene scelto un renderer predefinito specifico per i numeri che li tiene allineati a destra.
    Ultima modifica di andbin; 24-09-2014 a 23:32
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Presumo che siano dei String ... se fossero dei Integer, il row sorter predefinito dovrebbe (vado a mente, dovrei verificare) ordinare correttamente per "numero" come vuoi.
    Già sono dei String...

    Come faccio a mettere solo in quella colonna degli Integer?

    Per aggiungere una riga ho passato un array di Stringhe al metodo addRow :

    modelloJTable.addRow(stringaArticolo);

    Potrei scegliere di inserire sia Stringhe che Integer?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Per aggiungere una riga ho passato un array di Stringhe al metodo addRow :

    modelloJTable.addRow(stringaArticolo);

    Potrei scegliere di inserire sia Stringhe che Integer?
    Deduco che stai usando DefaultTableModel, che ha appunto addRow. Non hai precisato però se usi la versione con Object[] o quella con Vector (cos'è stringaArticolo ?). Ma in ogni caso la tupla di N dati per la riga la componi tu in qualche modo.
    Innanzitutto fai in modo da avere oggetti Integer per quella colonna. Come farlo dipende da dove ti arrivano questi dati e quanto puoi controllarli riguardo il tipo.

    Questo però è solo uno degli aspetti da considerare. Come ho detto prima, puoi far cadere il sorting nella regola 3 ma questo vuol dire che il model dovrebbe fornire Integer.class per quella colonna. DefaultTableModel ritorna per default sempre Object.class.

    Quindi le soluzioni sono (almeno) due:
    - estendi DefaultTableModel giusto solo per ridefinire il getColumnClass in modo da applicare la regola 3
    oppure
    - implementi un Comparator per sfruttare la regola 1: "If a comparator has been specified by invoking setComparator, use that comparator."
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Deduco che stai usando DefaultTableModel, che ha appunto addRow. Non hai precisato però se usi la versione con Object[] o quella con Vector (cos'è stringaArticolo ?). Ma in ogni caso la tupla di N dati per la riga la componi tu in qualche modo.
    stringaArticolo è un array di stringhe che inserisco nella riga

    codice:
    String [] stringaArticolo = {FinestraAggiungiArticolo.jtextfieldTipo.getText(), FinestraAggiungiArticolo.jtextfieldMarca.getText(), FinestraAggiungiArticolo.jtextfieldModello.getText(), FinestraAggiungiArticolo.jtextfieldQuantità.getText(), FinestraAggiungiArticolo.jtextfieldPrezzo.getText()+"  EURO" , FinestraAggiungiArticolo.jtextfieldCodice.getText()};
    		InterfacciaPrincipale.modelloJTable.addRow(stringaArticolo);
    Si sto utilizzando un DefaultTableModel..

    Guarda potrei mandarti il Jar eseguibile cosi lo fai partire e ti rendi conto meglio

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    codice:
    String [] stringaArticolo = {FinestraAggiungiArticolo.jtextfieldTipo.getText(), FinestraAggiungiArticolo.jtextfieldMarca.getText(), FinestraAggiungiArticolo.jtextfieldModello.getText(), FinestraAggiungiArticolo.jtextfieldQuantità.getText(), FinestraAggiungiArticolo.jtextfieldPrezzo.getText()+"  EURO" , FinestraAggiungiArticolo.jtextfieldCodice.getText()};
    Innanzitutto non è (stilisticamente parlando) un "bel" codice comporre un array literal facendo tutte quelle invocazioni. Oltretutto accedi direttamente a campi di un'altra classe. E pure questo è un pessimo design.

    E in ogni caso .... sono tutti String. Dovresti convertire in Integer la stringa che ti interessa trattare come numerica. Con quello che ne deriva, cioè il fatto di applicare una "validazione" (e magari anche conversione) dell'input che avresti dovuto fare prima ... non qui in questo preciso punto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    E' il mio primo progetto...
    lo so a livello di design fa un pò cagare ma l'importante è che funzioni

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto non è (stilisticamente parlando) un "bel" codice comporre un array literal facendo tutte quelle invocazioni. Oltretutto accedi direttamente a campi di un'altra classe. E pure questo è un pessimo design.
    Intendi creare dei metodi accessori per non accedere ai campi direttamente?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    - estendi DefaultTableModel giusto solo per ridefinire il getColumnClass in modo da applicare la regola 3
    getColumnClass?

    Potresti aiutarmi a come modificarlo per far si che i numeri della colonna relativa si ordinino?
    Ultima modifica di Markus85; 29-09-2014 a 18:04

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.