ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
2973
2973
EMPFEHLEN
-
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:
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)
-
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 :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
-
Hibernate Sortierung von Datensätzen nach unterschiedlichen Spalten
Von AndreBrueck im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 04.09.09, 18:48 -
Sortierung einer JTable
Von Saban im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 10.03.09, 19:31 -
JTable Sortierung nach Refresh
Von DUme im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 07.01.09, 12:01 -
Array nach numerischen und assoziativen Schlüsseln trennen
Von Neurodeamon im Forum PHPAntworten: 7Letzter Beitrag: 20.12.03, 19:57 -
Update Ansicht einer JTable nach Änderungen
Von AlexD1979 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 21.07.03, 00:55





Zitieren

Login





