Ich habe eine JTable die ich per Code mit Daten fülle:
for (int i = ((DefaultTableModel) tableOre.getModel()).getRowCount() - 1; i >= 0; i--) {
((DefaultTableModel) tableOre.getModel()).removeRow(i);
}
for (int j = 0; j < oreList.size(); j++) {
Object[] obj = new Object[]{oreList.get(j).getName(), oreList.get(j).getTritanium(),
oreList.get(j).getPyerite(), oreList.get(j).getMexallon(), oreList.get(j).getIsogen(),
oreList.get(j).getNocxium(), oreList.get(j).getZydrine(), oreList.get(j).getMegacyte(),
oreList.get(j).getMorphite()};
((DefaultTableModel) tableOre.getModel()).addRow(obj);
}```
Hierbei Funktioniert die Sortierung super, einziges Manko:
Wie kann ich es Programmieren, dass ein User durch einen klick auf eines der header Felder (Name, Tritanium, Pyerite......) die Tabelle nach diesen Werten sortieren kann?
Danke euch 2 schonmal für die Tutorials, daran hatte ich mich vorhin schonmal orientiert funktioniert an sich auch wunderbar, habe allerdings Probleme:
Problem die Sortierung läuft nach Strings, somit ist 1000 < 800.
In dem Tutorial haben ich dann folgendes gefunden:
= new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys); ```
zusammen mit dem hier:
```MyTableModel model = new MyTableModel();
sorter = new TableRowSorter<MyTableModel>(model);
table = new JTable(model);
table.setRowSorter(sorter);```
Daraus habe ich dann gebastelt:
```List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
[...]
sortKeys.add(new RowSorter.SortKey(8, SortOrder.ASCENDING));
TableRowSorter sorter = new TableRowSorter(tableOre.getModel());
sorter.setSortKeys(sortKeys);
tableOre.setRowSorter(sorter);```
Da laut Beschreibung
ASCENDING
nach Zahlen sortiert, allerdings macht er nach den Änderung immernoch keine richtige Sortierung der Zahlen, die Sortierung von Strings hingegen funktioniert wunderbar.
nach Zahlen sortiert[/QUOTE]
Ascending heißt nur, dass absteigend sortiert wird und ist von dem zu sortierenden Datentyp völlig unabhängig. Der gepostete Code hat mit Deinem Problem nichts zu tun, hier wird nur die Sortierreihenfolge und Richtung für der Spalten bei einer Sortierung gesetzt.
Stehen in der Spalte ausschließlich Ganzzahlen? Dann reicht es wenn das TableModel für diese Spalte z.B. Integer.class als Typ zurück liefert (vgl. Bsp Code auf der Seite) und die Zahlen werden auch als Zahlen interpretiert und sortiert.
Bei gemischten Spalten mit Strings und Zahlen musst Du Dir wohl einen eigenen Comparator für den Sorter schreiben.
[QUOTE=_Michael;71358]Ascending heißt nur, dass absteigend sortiert wird und ist von dem zu sortierenden Datentyp völlig unabhängig. Der gepostete Code hat mit Deinem Problem nichts zu tun, hier wird nur die Sortierreihenfolge und Richtung für der Spalten bei einer Sortierung gesetzt.
Stehen in der Spalte ausschließlich Ganzzahlen? Dann reicht es wenn das TableModel für diese Spalte z.B. Integer.class als Typ zurück liefert (vgl. Bsp Code auf der Seite) und die Zahlen werden auch als Zahlen interpretiert und sortiert.
Bei gemischten Spalten mit Strings und Zahlen musst Du Dir wohl einen eigenen Comparator für den Sorter schreiben.[/QUOTE]
Danke dafür, habe mir nun einen eigenen (bzw. 2) Comparatoren geschrieben, einen für Strings und einen für Ints, funktioniert auch wunderbar:
Comparator cInt = new Comparator() {
public int compare(Object o1, Object o2) {
return Integer.valueOf(o1.toString()).intValue() - Integer.valueOf(o2.toString()).intValue();
}
};
Comparator cString = new Comparator() {
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
};
sorter.setComparator(0, cString);
sorter.setComparator(1, cInt);
[...]
sorter.setComparator(8, cInt);```
Noch eine Anmerkung: Die Default Implementierung kann schon einige Datentypen sortieren. Dazu muss sie allerdings wissen, um welchen Datentypen es sich handelt. Alternativ wäre in Deinem Fall z.B. eine Anpassung des TableModels in folgender Weise möglich:
switch (column) {
case 0:
return Integer.class;
case 8:
return Integer.class;
}
return super.getColumnClass(column);
}```
Es empfiehlt sich ohnehin meistens, erst das Model zu erstellen und genau wie für den dazugehörigen JTable eine Referenz darauf zu halten. Das lästige (DefaultTableModel)table.getModel() kann man sich dadurch sparen.
DefaultTableModel model=new DefaultTableModel()
{
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return Integer.class;
case 8:
return Integer.class;
}
return super.getColumnClass(column);
}
};
fillModelWithDataLikeInOP(model);
JTable table=new JTable(model);