Swing JXTable RowSorter

proph

Neues Mitglied
Moin zusammen,

ich habe gerade folgende Schwierigkeit, die ich nicht gelöst bekomme.
Meine Applikation hat eine JXTable mit mehreren Columns die alle, mit klick auf den Header, sortiert werden. Das funktioniert auch alles so wie es sein soll.
Befüllt werden die Rows mit unterschiedlichen Daten - im gleichen Prozess wird eine art Summezeile eingefügt, die alle Werte summiert darstellt. Leider wird beim Sortieren diese mit sortiert, was nicht passieren sollte.

Nun hab ich lange im Web geforscht und auch selber mich mit dem RowSorter befasst, um es irgendwie zu realisieren das die letzte Row nicht mit sortiert wird.

Hat jemand von Euch sowas schon mal realisiert?

Bin über jeden Hinweis dankbar!

Besten Gruß,
proph
 

Kleopatra

Mitglied
Das ist nicht wirklich trivial, es gibt aber einige Ansätze die ich auch gerade nicht finde ;-) such mal nach JSummaryTable (oder so ähnlich) - eine Version sollte irgendwo im jdnc-incubator sein, auch wurde im OTN Swing forum mal drüber diskutiert.

Sorry für die Unkonkretheit, vielleicht hilft's ja trotzdem ein bißchen

Gruß
Jeanette
 

Kleopatra

Mitglied
nein, das reicht nicht - der Comparator/Comparable kann zwar benutzt werden um irgendwas als kleiner-/größer-als-alles-andere zu implementieren, nicht aber um eine Zeile immer unterhalb zu halten (unabhängig von der aktuellen Sortierung)

Gruß
Jeanette
 

LoR

Bekanntes Mitglied
ebenso ... probier's einfach, dann wirst Du schon sehen, daß es so einfach nicht geht ;-)

Schnell zusammengebastelt:

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class TableRowExampleMain {

    public static void main(String[] args) {
        List<TableRowExample> list = new ArrayList<>();
        
        //Zeilen hinzufügen
        Random rand = new Random(123456789L);
        long sumCell1 = 0;
        int sumCell2 = 0;
        int sumCell3 = 0;
        for (int i = 0; i < 10; i++) {
            sumCell1 += rand.nextInt(100);
            sumCell2 = rand.nextInt(10);
            sumCell3 += rand.nextInt(1000);
            list.add(new TableRowExample(sumCell1, sumCell2, sumCell3, false));
        }
        
        //Summary hinzufügen
        list.add(new TableRowExample(sumCell1, sumCell2, sumCell3, true));
        
        //Sortieren nach Cell1
        Collections.sort(list, new Comparator<TableRowExample>() {

            @Override
            public int compare(TableRowExample o1, TableRowExample o2) {
                if(o1.isSummary()) {
                    return +1;
                } else if(o2.isSummary()) {
                    return -1;
                }
                
                return (int) (o1.getCell1() - o2.getCell1());
            }
        });
        
        //Ausgabe
        for (TableRowExample row : list) {
            System.out.println(row);
        }
    }
}

Java:
public class TableRowExample {

    private final long cell1;
    private final int cell2;
    private final int cell3;
    private final boolean summary;

    public TableRowExample(long cell1, int cell2, int cell3, boolean summary) {
        this.cell1 = cell1;
        this.cell2 = cell2;
        this.cell3 = cell3;
        this.summary = summary;
    }

    public long getCell1() {
        return cell1;
    }

    public int getCell2() {
        return cell2;
    }

    public int getCell3() {
        return cell3;
    }

    public boolean isSummary() {
        return summary;
    }

    @Override
    public String toString() {
        return "TableRowExample{" + "cell1=" + cell1 + ", cell2=" + cell2 + ", cell3=" + cell3 + ", summary=" + summary + '}';
    }
}
 

Kleopatra

Mitglied
schöne Bastelarbeit, um "Comparator/Comparable kann zwar benutzt werden um irgendwas als kleiner-/größer-als-alles-andere zu implementieren" :)

Wie schon gesacht, reicht das aber nicht: die summary wird fix als größtes/kleinsted eingeordnet. Und dann sortiert die UserIn die TableColumn andersrum ... und aus größtest wird kleinstest.

Der einzige Ansatzpunkt liegt im RowSorter (der muß wissen, eine/mehrere rows gar nicht in die Sortierung zu geben). DefaultRowSorter ist leider so klemm geheim, das nur eine fast vollständige Reimplemtierung das erreichen kann

Gruß
Jeanette
 

LoR

Bekanntes Mitglied
Im TableRowSorter (Java Platform SE 6) lässt sich der entsprechende Comparator setzen. Natürlich ist noch das ein oder andere Model zu implementieren bzw. evtl. ein eigener RowSorter. Von Komplex kann aber wirklich nicht die Rede sein.

Aber egal ich gebs jetzt auf.

@proph
Wenn noch Interesse besteht würde ich eine entsprechende Implementierung nachliefern.
 

Kleopatra

Mitglied
klar läßt sich der setzen, aber es ist _derselbe_ für beide Sortierrichtungen ... damit kannst Du nicht erzwingen, daß die Summery immer _unter_ (also am unteren Rand der JTable) allen anderen Werten liegt, und das für auf- und absteigend.

Mir ist komplett unverständlich, warum Du das Problem nicht siehst. Setz ihn doch einfach ein (hier für Dich gemacht) - dann klick auf den header: summary am unteren Rand der table, klick nochmal: summary am oberen Rand. Nicht wirklich das, was UserInnen von summary erwarten ..

Java:
        DefaultTableModel model = new DefaultTableModel(0, 1);
        for (int i = 0; i < 10; i++) {
            model.addRow(new Object[] {new TableRowExample(100 * i, i, i, false)});
        }
        model.insertRow(5, new Object[] {new TableRowExample(0, 0, 0, true)});
        JTable table = new JTable(model);
        table.setAutoCreateRowSorter(true);
        Comparator comparator = new Comparator<TableRowExample>() {
 
            @Override
            public int compare(TableRowExample o1, TableRowExample o2) {
                if(o1.isSummary()) {
                    return +1;
                } else if(o2.isSummary()) {
                    return -1;
                }
                
                return (int) (o1.getCell1() - o2.getCell1());
            }
        };
        ((TableRowSorter) table.getRowSorter()).setComparator(0, comparator);

Und Tschüß
Jeanette
 

LoR

Bekanntes Mitglied
Erstmal Danke für das Beispiel.

Nachfolgend die Lösung für die erste Spalte:

Java:
        DefaultTableModel model = new DefaultTableModel(0, 1);
        for (int i = 0; i < 10; i++) {
            model.addRow(new Object[] {new TableRowExample(100 * i, i, i, false)});
        }
        model.insertRow(5, new Object[] {new TableRowExample(0, 0, 0, true)});
        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        Comparator comparator = new Comparator<TableRowExample>() {
 
            @Override
            public int compare(TableRowExample o1, TableRowExample o2) {
                SortOrder sortOrder = table.getRowSorter().getSortKeys().get(0).getSortOrder();

                if(o1.isSummary()) {
                    return sortOrder == SortOrder.ASCENDING ? +1 : -1;
                } else if(o2.isSummary()) {
                    return sortOrder == SortOrder.ASCENDING ? -1 : +1;
                }
                
                return (int) (o1.getCell1() - o2.getCell1());
            }
        };
        ((TableRowSorter) table.getRowSorter()).setComparator(0, comparator);

Ich hoffe wir können damit die Diskussion beenden ;).

Gruß
 

Kleopatra

Mitglied
dieses unsaubere Brett hatte ich befürchtet ... nix, was eine QA passieren könnte (ein Comparator _darf_ seine Umgebung nicht kennen)

Schönen Abend noch, Du hoffnungloser Fall :)
Jeanette
 

LoR

Bekanntes Mitglied
dieses unsaubere Brett hatte ich befürchtet ... nix, was eine QA passieren könnte (ein Comparator _darf_ seine Umgebung nicht kennen)

Schönen Abend noch, Du hoffnungloser Fall :)
Jeanette

Es handelt sich doch dabei um ein Beispiel. Eine saubere Lösung benötigt selbstverständlich mehr Zeit und ist für ein Forum eher ungeeignet.

Wünsche auch noch einen schönene Abend :).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Wie JXTable importieren AWT, Swing, JavaFX & SWT 2
B Swing BalloonTip erscheint nicht in den ersten Zeilen einer JXTable AWT, Swing, JavaFX & SWT 4
B JXTable Invalid range Problem AWT, Swing, JavaFX & SWT 5
B JXTable AWT, Swing, JavaFX & SWT 2
N Swing [JXTable] getColumnIndex mit dynamischen TableHeader AWT, Swing, JavaFX & SWT 4
S JXTable Header Tooltipps AWT, Swing, JavaFX & SWT 4
martin82 Swing JXTable gefilterte Zeilen AWT, Swing, JavaFX & SWT 4
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
A JXTable jede zweite Zeile einfärben AWT, Swing, JavaFX & SWT 4
G Frage zu SwingX JXTable und ColumnControl AWT, Swing, JavaFX & SWT 4
T JXTable AWT, Swing, JavaFX & SWT 5
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
N SWT Wie verwende ich den RowSorter? AWT, Swing, JavaFX & SWT 13
J Swing JTable RowSorter AWT, Swing, JavaFX & SWT 0
D Swing Letzte Zeile einer JTable nicht über RowSorter sotieren AWT, Swing, JavaFX & SWT 2
C Swing RowSorter getSortOrder() ? AWT, Swing, JavaFX & SWT 2
J Swing RowSorter für (negative) Integer / Floats - JTable AWT, Swing, JavaFX & SWT 5
bluerob Nach RowSorter -> Keine Tabellenüberschreibung möglich AWT, Swing, JavaFX & SWT 7
E Eigenen RowSorter AWT, Swing, JavaFX & SWT 11
T JTable / RowSorter macht große Probleme AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: Fehler beim Nutzen von RowSorter#setRowFilter AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Concurrency fireTableDataChanged() + RowSorter? AWT, Swing, JavaFX & SWT 5
S Swing JTable RowSorter trotz RowFilter abschalten? AWT, Swing, JavaFX & SWT 2
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
V Vector->TableModel->RowSorter:Bei Markierung Index im AWT, Swing, JavaFX & SWT 2
G Problem mit RowSorter AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen


Oben