TableRowSorter

tuedel

Aktives Mitglied
Guten Morgen an alle.

Ich habe ein kleines Problem mit der Sortierung einer JTable. Ich verwende ein eigenes TableModel, wo ich die Daten wie folgt vorhalte:

Java:
    private List<C> rowData = CollectionFactory.newList();
    private Integer columnCount;

    public LBoardTableModel(int columnCount) {
        this.columnCount = columnCount;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {         
        return rowData.get(rowIndex);
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
       //
    }
    
    public void setValue(C aValue, int rowIndex, int columnIndex) {
        rowData.set(rowIndex, aValue);
        fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public int getRowCount() {
        return rowData.size();
    }

    @Override
    public int getColumnCount() {
        return columnCount;
    }
}

Jetzt könnte man behaupten, dass die Art und Weise mit der ich die Daten vorhalte, ungewöhnlich erscheint. Diese Vorgehensweise ermöglicht es mir aber, unabhängig vom Inhalt der Daten, die Spaltensortierung zu ändern und nur ein Model für jede Art eines Datenformates zu verwenden. Ich habe ein columns object, dass über einen Enum die möglichen Bestandteile einer Tabelle beschreibt. Durch den Spaltenindex kann ich dann die jeweiligen Daten aus meinem C value des Models herausziehen und an den Renderer übergeben.

Leider scheint der Rowsorter damit nicht klarzukommen. Ich vermute, dass er die Werte aus getValueAt(); zum Vergleich heranzieht. Er bekommt jedoch das gewünschte Objekt und den dafür passenden Comparator beim erzeugen der Objekte:

Java:
columns = new Object[]{
                    LBoardColumnValues.NUMBER,
                    LBoardColumnValues.PRED_RANK,
                    LBoardColumnValues.NET_POINTS,
                    LBoardColumnValues.TOTALPOINTS,
                    LBoardColumnValues.COLOR};
                
                tableHeader = new EntryTableHeader(columns);

                tableModel = new LBoardTableModel(columns.length);
                table.setModel(tableModel);
                
                rowSorter = new TableRowSorter<LBoardTableModel>(tableModel);                                
                rowSorter.setComparator(0, Comparators.getPredictiveRankComparator());                
                rowSorter.setSortsOnUpdates(true);
                rowSorter.sort();
                
                
                table.setRowSorter(rowSorter);
                renderer = new LBoardRenderer(columns);
                table.setDefaultRenderer(Object.class, renderer);

Jedoch passiert rein gar nichts - auch keine Fehler. Selbst wenn ich den Comparator nicht setze, sollte er ja die Objekte aus der List<C> in einen String umwandeln und die Tabelle nach dieser Reihenfolge sortieren, was jedoch auch nicht passiert. Habe ich etwas essentielles übersehen?!

Herzlichen Dank für eure Hilfe.
LG
tuedel
 

Sanbex

Mitglied
Willst du die Daten im Model sortiert haben, oder nur die Ausgabe im JTable?

Hab grad ein ähnliches Problem:

Mit einem TableHeader lassen sich die Sachen wunderbar in der Ausgabe sortieren.

Wenn ich sortiere, ist mein Model immer noch dasselbe ==> wenn ich was selektiere weiß ich nicht, wie ich an das selektierte Element gelange, und nicht an das, was im Model an dieser Stelle (row, col) steht???:L

mfg
 

Camill

Bekanntes Mitglied
[...]
Wenn ich sortiere, ist mein Model immer noch dasselbe ==> wenn ich was selektiere weiß ich nicht, wie ich an das selektierte Element gelange, und nicht an das, was im Model an dieser Stelle (row, col) steht???:L
[...]

[japi]JTable#getSelectedRows()[/japi] -> gibt die selektierten Zeilen zurück
[japi]JTable#convertRowIndexToModel(int viewRowIndex)[/japi] -> gibt den Index einer selektierten Zeile(View) als Index im Model zurück, umgekehrt geht das ganze natürlich auch: [japi]JTable#convertRowIndexToView(int modelRowIndex)[/japi]


@ tuedel
Dir kann ich leider nicht Helfen, habe bisher noch keinen RowSorter gebraucht.
 

Sanbex

Mitglied
hmm danke für die antwort, habs jetzt so gelöst, dass sich mein model mithilfe von nem compareTo sortiert, wann ich das brauche... ist zwar nicht die schönste Lösung, war aber nebensächlich notwendig und bin froh dass das jetzt endlich klappt^^

mfg
 

tuedel

Aktives Mitglied
Hallo!!

Ich habe letztlich auf den Rowsorter verzichtet und sortiere das Model selbst und aktualisiere danach on demand die Anzeige. Auf die Weise konnte ich dann auch sicherstellen, dass ich aus der Mouseposition die gewünschten Daten aus dem Model ziehen kann (row und column). Habe die methoden des Tablemodels letztlich alle überschrieben und angepasst.

Lg
tuedel
 

Ähnliche Java Themen

Neue Themen


Oben