Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [java] sorting JTable

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    74

    [java] sorting JTable

    Ciao,
    Ho implementato una JTable che pesca dei dati da un database mysql.
    Gli ho aggiunto un tableRowSorter per permettere un ordinamento della tabella
    codice:
     final TableRowSorter<TableModel> sorter=new TableRowSorter<TableMode(parcoTableModel);
     table.setRowSorter(sorter);
    Mi è sorto il problema che essendo la prima colonna della tabella di tipo string,se creo dei campi chiamati ad esempio p1,p2,p10; mi vengono ordinati:
    1)p1
    2)p10
    3)p2

    Mentre vorrei che mi venissero ordinati come
    1)p1
    2)p2
    3)p10

    Mi stavo domandando se c'era un modo per "modificare" il sorter della JTable,ho provato a consultare la documentazione ufficiale ma non sono riuscito a risolvere il problema.

    Vi rigrazio in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Un chiarimento:

    le stringhe saranno tutte del tipo: "carattere(i) seguito(i) da numeri" oppure potrai anche avere casi in cui dopo i caratteri ci saranno numeri mischiati ai caratteri?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    74
    non c'è nessun vincolo per le stringhe,
    Ma volevo gestire quel caso nello specifico

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    devi implementare il tuo Comparator da dare al DefaultRowSorter... però se non c'è alcun vincolo non ne esci in modo pulito. Mi spiego: appurato che

    p2

    debba precedere

    p10

    perché, indovino la regola, splitto la stringa separando letterari e numerici, ed ordino prima sui letterari e poi sui numerici, che ne sarebbe di

    p2, p10, p3p - ovvero, dove dovrebbe andare p3p? Una regola la devi decidere, per quanto complicata, altrimenti un tipo di ordinamento che sembra ovvio divverà inconsistente in certi casi.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    74
    Cosa intendi per implementare il comparator?

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Bastava usare lo Swing Tutorial... comunque, una cosa del genere
    codice:
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.table.*;
    
    import java.util.*;
    
    /**
     *
     * @author Andrea
     */
    public class CustomJTableRowSorter extends JFrame {
        
        private static class MyComparator implements Comparator {
            
            public int compare(Object o1, Object o2) {
                String s1 = o1.toString().trim().replaceAll("\\d", "");
                String s2 = o2.toString().trim().replaceAll("\\d", "");
                
                try {
                    Integer d1, d2;
                    try {
                        d1 = new Integer(o1.toString().trim().replaceAll("\\D", ""));
                    }
                    catch (Exception e) {
                        d1 = Integer.MIN_VALUE;
                    }
                    try {
                        d2 = new Integer(o2.toString().trim().replaceAll("\\D", ""));
                    }
                    catch (Exception e) {
                        d2 = Integer.MIN_VALUE;
                    }
                    return (s1.compareTo(s2) == 0 ? 
                        (d1.compareTo(d2)) : s1.compareTo(s2)
                        );                 
                }
                catch (Exception e) {
                    e.printStackTrace();
                    return s1.compareTo(s2);
                }
            }
            
        }
        
        public CustomJTableRowSorter() {
            super("Test Frame");
            String[] columns = new String[] {"First", "Second"};
            Object[][] data = {
                {"p10", "HTML.IT"}, 
                {"p2", "GOOGLE.COM"},
                {"p", "UBUNTU.ORG"},            
                {"p20", "YAHOO.COM"},
                {"p3", "MICROSOFT.COM"}
                    
            };
            JTable table = new JTable(data, columns);        
            TableRowSorter sorter = new TableRowSorter(table.getModel());
            sorter.setComparator(0, new MyComparator());
            table.setRowSorter(sorter);
                  
            this.add(new JScrollPane(table));
            this.setVisible(true);
            this.pack();
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public static void main (String[] args) {
            new CustomJTableRowSorter();
            
        }
        
    }
    bada, non vuole essere esaustivo ed è stato scritto in circa 5 minuti, per cui il Comparator potrebbe non essere consistente... però mi sembra che ordini come vuoi tu.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    74
    Grazie per la dritta

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Da notare che, se non avessi avuto dei vincoli, ti saresti risparmiato tutto quel lavoro dando ai campi valori come p01, p02, ..., p10


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.