Sortierung einzelner Zeilen durch den User

Moin Moin,

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?

Guck dir mal das Tutorial an: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting

Mittels RowSorter
Im einfachsten Fall reicht ein table.setAutoCreateRowSorter(true);
Infos:
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting

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.

[QUOTE=Gossi]Da laut Beschreibung

 ASCENDING

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);```

Dann passt es ja.

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);