TableRowSorter

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

ich versuche grade einen TableRowSorter zu verwenden, scheitere aber.
Bisher habe ich:
Code:
sorter = new TableRowSorter<MyTableModel>( model );
table.setRowSorter(sorter);
ArrayList<RowSorter.SortKey> list = new ArrayList<RowSorter.SortKey>(1);
list.add(new javax.swing.RowSorter.SortKey(0,javax.swing.SortOrder.ASCENDING) );
sorter.setSortKeys(list);
sorter.sort();

Zur Laufzeit des Programmes werden dann Daten in die Tabelle geschrieben. Danach rufe ich sorter.sort(); auf aber nichts passiert. Was läuft da schief??

Danke jetzt schonmal!
 
G

Gast

Gast
Ja, dann gehts bei mir auch.
Nur wenn ich zur Laufzeit Daten einfüge, und dann nochmal sortiere, passiert nichts mehr - es wird also nichts sortiert!

Das ist ja das Problem!
 
S

SlaterB

Gast
werden denn die neuen Daten überhaupt angezeigt?
(fireTableDataChanged())

funktioniert es überhaupt, zur Laufzeit die Daten erneut/ anders zu sortieren?


funktioniert es nur im Moment des Einfügens nicht mehr
oder danach für alle Zeiten nicht mehr?
 
G

Gast

Gast
Also die Daten werden angezeigt.
Und wenn ich auf die Spaltenköpfe klicke wird auch nach der entsprechenden Spalte sortiert.

Auch wenn ich später, nach ende der Funktion die die Daten einfügt und auch sortieren sollte, nochmals den Sorter aufrufe, üpassiert auch nichts.

Irgendwie seltsam.
 

André Uhres

Top Contributor
Ich brauche nach dem Einfügen nicht zu sortieren, denn es ist dann schon automatisch sortiert:
Code:
package table;
/*
 * SortTableDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class SortTableDemo extends JFrame {
    private JButton btAdd, btSort;
    private JTable table;
    private JToolBar toolbar;
    private DefaultTableModel model;
    private TableRowSorter sorter;
    public SortTableDemo() {
        super("Sort Table Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        //JComponents erzeugen:
        toolbar = new JToolBar();
        btAdd = new JButton("Add Data");
        btSort = new JButton("Sort DESCENDING");
        table = new JTable();
        //Layout:
        toolbar.add(btAdd);
        toolbar.add(btSort);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        //Table Model setzen:
        table.setModel(new DefaultTableModel(
                new Object [][] {
                    {"1", "1", "1", "1"},
                    {"3", "2", "2", "2"},
                    {"2", "3", "3", "3"},
                    {"0", "4", "4", "4"}
        },
                new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class, String.class, String.class
            };
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        //Sorter setzen:
        model = (DefaultTableModel)table.getModel();
        sorter = new TableRowSorter<DefaultTableModel>( model );
        table.setRowSorter(sorter);
        //sortieren:
        sortTable(SortOrder.ASCENDING);
        //Listeners:
        btAdd.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btAddActionPerformed(evt);
            }
        });
        btSort.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btSortActionPerformed(evt);
            }
        });
    }
    //Methode zum Sortieren der ersten Spalte:
    private void sortTable(final SortOrder order){
        ArrayList<RowSorter.SortKey> list = new ArrayList<RowSorter.SortKey>(1);
        list.add(new RowSorter.SortKey(0, order));
        sorter.setSortKeys(list);
        sorter.sort();
    }
    private void btSortActionPerformed(final ActionEvent evt) {
        sortTable(SortOrder.DESCENDING);
    }
    private void btAddActionPerformed(final ActionEvent evt) {
        String[] rowData = {"G", "5", "5", "5"};
        model.addRow(rowData);
        rowData = new String[]{"D", "6", "6", "6"};
        model.addRow(rowData);
        rowData = new String[]{"2", "7", "7", "7"};
        model.insertRow(0, rowData);
    }
    public static void main(final String args[]) {new SortTableDemo().setVisible(true);}
}
 
G

Gast

Gast
Für mich nicht ganz verständlich, aber das Problem ist gelöst!!!

Und zwar habe ich zuvor zum sortieren immer nur sorter.sort(); aufgerufen. Jetzt habe ich eine Funktion gebaut, die bei jedem Sortieren erst wieder die SortKeys zuweist und dann erst sorter.sort(); ausruft.

Behält sich der TableRowSorter nicht die SortKeys bis ihm was anderes gesagt wird??

Gruß und Danke
 

André Uhres

Top Contributor
Gast hat gesagt.:
..Behält sich der TableRowSorter nicht die SortKeys bis ihm was anderes gesagt wird?..
Ich würde sagen, daß er sie behält.
Das lässt sich aber nicht so ohne Weiteres überprüfen,
weil ein einfaches Wiederholen der letzten Sortierung ja eh nix ändert.

EDIT: Doch, kann man überprüfen: wenn man einen Wert manuell in der ersten Spalte ändert
und dann neu sortiert mit "sorter.sort();" (über einen extra Button), dann mach er das auch!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben