Sortierung einer JTable nach numerischen Spalten

Greq

Grünschnabel
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
 
So sollte es gehen, sofern du den selben TableSorter meinst wie ich:

Java:
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);
	}
}
 
Zuletzt bearbeitet:
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
 
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!
 
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:
...
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:
        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
 
Zurück