tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
2973
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Greq Greq ist offline Mitglied
    Registriert seit
    Apr 2006
    Beiträge
    13
    Tag auch !

    Habe das folgende Problem:
    - Ich bekomme aus einer DB (=>über ein Servlet) Daten in einem Vektor Vector :

    [
    [sst_nr, sst_name, sst_land_nr, anl_dat_zeit], // Spalten-Überschriften
    [NUMERIC, VARCHAR, NUMERIC, DATE], // Datentypen
    [2, Manipulationen, 0, null], // Daten(Rows)...
    [31, Preisdifferenzen, 3, null],
    [13, Preisdifferenzen, 1, null],
    [22, Preisdifferenzen, 2, null],
    [4, Nachlass/kond., 6, null]
    ]

    - Diese stelle ich in einer Tabelle dar.
    - Ein TableSorter sorgt für eine richtige Sortierung der "String"-Spalten

    ==> nun Würd ich gerne die "Zahlen"-Spalten (2, 31, 13, 22, 4) auch richtig sortieren (Diese werden wohl noch als String interpretiert), wie mache ich das am sinnvollen ?


    private TableModel TM;
    ....

    TM = new DefaultTableModel(rows, colNames) {
    @Override
    public boolean isCellEditable(int arg0, int arg1) {
    // @todo Auto-generated method stub
    return false;
    }

    TableSorter sorter = new TableSorter(TM);

    JTable table = new JTable(sorter); sorter.setTableHeader(table.getTableHeader());
    .....

    Gruß
    Greq
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    So sollte es gehen, sofern du den selben TableSorter meinst wie ich:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    package de.tutorials;
     
    import java.util.Comparator;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
     
    public class SimpleTable {
        public static void main(String[] args) {
     
            Object[][] rowData = {
                    { 2, "Manipulationen", 0, null }, // Daten(Rows)...
                    { 31, "Preisdifferenzen", 3, null },
                    { 13, "Preisdifferenzen", 1, null },
                    { 22, "Preisdifferenzen", 2, null },
                    { 4, "Nachlass/kond.", 6, null } };
     
            final String[] dataType = { "NUMERIC", "VARCHAR", "NUMERIC", "DATE" }; // Datentypen
     
            String[] columnNames = { "sst_nr", "sst_name", "sst_land_nr",
                    "anl_dat_zeit" }; // Spalten-Überschriften
     
            DefaultTableModel model = new DefaultTableModel(rowData, columnNames) {
                @Override
                public boolean isCellEditable(int arg0, int arg1) {
                    // @todo Auto-generated method stub
                    return false;
                }
     
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    if (dataType[columnIndex].equalsIgnoreCase("NUMERIC")) {
                        return Integer.class;
                    }
                    // TODO Auto-generated method stub
                    return super.getColumnClass(columnIndex);
                }
            };
     
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            TableSorter sorter = new TableSorter(model);
            JTable table = new JTable(sorter);
            sorter.setTableHeader(table.getTableHeader());
            sorter.setColumnComparator(Integer.class, new Comparator<Integer>() {
                public int compare(Integer int1, Integer int2) {
                    return int1.intValue() - int2.intValue();
                }
            });
     
            f.add(new JScrollPane(table));
            f.pack();
            f.setVisible(true);
        }
    }
    Geändert von zeja (08.11.06 um 19:46 Uhr)
     

  3. #3
    Greq Greq ist offline Mitglied
    Registriert seit
    Apr 2006
    Beiträge
    13
    Vielen Dank zeja,

    nun kann ich endlich numerisch Sortieren.

    Jetzt will ich aber auch, neben den Integer-Spalten, auch Double-Spalten sortieren.

    Ist dies mit dem TableSorter möglich und wie ?

    P.S. Habe den TableSorter von SUN.

    Gruß
    Greq
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Schon in der Schule wars so: Ein Teil der Aufgabe ist immer Transferleistung. Hättest du mein Beispiel verstanden, wüsstest du wie du das auch für Double hinbekommst. Also denk mal nach!
     

  5. #5
    Greq Greq ist offline Mitglied
    Registriert seit
    Apr 2006
    Beiträge
    13
    Ok, ok, ....

    Bin zwar kein Java-Entwickler aber nach einiger Zeit habe ich es herausbekommen, weiß zwar nicht ob diese die ideale Lösung ist aber es erfüllt seinen Zweck.

    Hier ein Quellcode-Auszug:

    Die Klasse (bei mir extends JTable) erhält 3 Vektoren alle im String-Format:
    headers = headersInput;
    colTypes = typesInput;
    data = objdataInput;

    Vorbereitung, bzw. Aufbereitung (Vektor=>Objekt):
    ...
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    ...
    objInObj = new Object [data.size()][headers.size()];
    objColNames = new Object[headers.size()];
    objColType = new Object[colTypes.size()];
    objColNumTypes = new Object[colTypes.size()];
    .....
            for (int a = 0 ; a < data.size(); a++) {
                Vector tmpDat = (Vector) data.elementAt(a);
                
                for (int b=0 ; b < tmpDat.size() ; b++){
                
                    if (objColType[b].toString().equals("NUMERIC")){
                    
                        if (tmpDat.elementAt(b).toString().equals("null")){
                            objInObj[a][b] = Integer.valueOf("0");
                            objColNumTypes[b] = "Integer";
                            
                        } else {
    //                      DOUBLE                      
                            if (tmpDat.elementAt(b).toString().contains(".")){
                                
                                objColNumTypes[b] = "Double";
                                double doublewert = 0;
                                try {
                                    doublewert = Double.valueOf(tmpDat.elementAt(b).toString());
                                    } catch (Exception e) {
                                        // TODO: handle exception
                                    }
                                    System.out.println("double: "+doublewert);
                                
                            objInObj[a][b] = doublewert;
                                    
                            } else {
                                objColNumTypes[b] = "Integer";
    //                      INTEGER
                                objInObj[a][b] = Integer.valueOf(tmpDat.elementAt(b).toString());   
                            }
                        }
                    } else {
    //              STRING
                    objInObj[a][b] = tmpDat.elementAt(b).toString();
                    }   
                    System.out.println(a+"_"+b+"Klasse:"+objInObj[a][b].getClass());
                }
            }
    ...

    Jetzt zum wesentlichen, dem tollen Comparator:

    ...
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
     
     
     
            DefaultTableModel model = new DefaultTableModel(objInObj, objColNames) {
                        /**
                 * 
                 */
                private static final long serialVersionUID = 1L;
     
                        @Override
                        public boolean isCellEditable(int arg0, int arg1) {
                            // @todo Auto-generated method stub
                            return false;
                        }
                        @Override
                        public Class<?> getColumnClass(int columnIndex) {
                                               
                            if (objColType[columnIndex].toString().equalsIgnoreCase("NUMERIC")) {
                                
                                if (objColNumTypes[columnIndex].toString().equals("Integer")){ 
                                System.out.println("getColumnClass return: Int");
                                    return Integer.class;
                                }
                                if (objColNumTypes[columnIndex].toString().equals("Double")){
                                    System.out.println("getColumnClass return: Double");
                                return Double.class;
                                }       
                            }
                            // TODO Auto-generated method stub
                            return super.getColumnClass(columnIndex);
                        }
                    };
     
     
            TableModel TM = model;       
            
            TableSorter sorter = new TableSorter(TM); 
         
            this.setModel(sorter);             
            sorter.setTableHeader(this.getTableHeader()); 
     
            sorter.setColumnComparator(sorter.getClass(), new Comparator(){
     
                public int compare(Object o1, Object o2) {
                    // TODO Auto-generated method stub
                    
                    double dbl1 = Double.valueOf(o1.toString());
                    double dbl2 = Double.valueOf(o2.toString());
                    
                     if (dbl1 < dbl2) {
                     return -1;
                     } else if (dbl1 > dbl2) {
                         return 1;
                     } else {
                         return 0;
                     }
                }           
            });
    ...

    MFG
    Greq
     

Ähnliche Themen

  1. Hibernate Sortierung von Datensätzen nach unterschiedlichen Spalten
    Von AndreBrueck im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 04.09.09, 18:48
  2. Sortierung einer JTable
    Von Saban im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 10.03.09, 19:31
  3. JTable Sortierung nach Refresh
    Von DUme im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 07.01.09, 12:01
  4. Antworten: 7
    Letzter Beitrag: 20.12.03, 19:57
  5. Update Ansicht einer JTable nach Änderungen
    Von AlexD1979 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 21.07.03, 00:55