Frage

Ich habe eine einfache Tabellenansicht (Java FX 2.0, aber ich nehme an, das Problem ist ziemlich allgemein gehalten), die die Standardsortierfunktion erhält.Die Tabelle enthält jedoch eine Summe in der letzten Zeile, daher möchte ich diese letzte Zeile vom Sortieralgorithmus ausschließen.

Ich habe eine Lösung für eine Swing-Tabelle gefunden, die besteht aus erstellen einer separaten Tabelle für die Gesamtzeile - das wäre in eine Tabellenansicht transponierbar, scheint aber etwas umständlich zu sein.Ich habe versucht, meinen eigenen Komparator zu implementieren, aber ich glaube nicht, dass es möglich ist, einen zu erstellen, der sowohl in aufsteigender als auch in absteigender Reihenfolge funktioniert.

War es hilfreich?

Lösung

Mit Javafx 8 ist es möglich, eine Sortierpolitik festzulegen, und das Problem ist einfacher zu fixieren.Angenommen, die Zeile, die die Summen enthält, ist generakodicetagcode:

generasacodicetagpre.

Andere Tipps

Basierend auf der Antwort von lolsvemir implementiere ich erfolgreich eine "SUMME" mit einem benutzerdefinierten Komparator.Ich habe den Komparator mit der sortTypeProperty der Spalte sortTypeProperty:col.setComparator(new BigDecimalColumnComparator(col.sortTypeProperty()));

Benutzerdefinierter Komparator:

public class BigDecimalColumnComparator implements Comparator<BigDecimal> {
    private final ObjectProperty<TableColumn.SortType> sortTypeProperty;

    public BigDecimalColumnComparator(ObjectProperty<TableColumn.SortType> sortTypeProperty) {
        this.sortTypeProperty = sortTypeProperty;
    }

    @Override
    public int compare(BigDecimal o1, BigDecimal o2) {
        TableColumn.SortType sortType = sortTypeProperty.get();
        if (sortType == null) {
            return 0;
        }

        if (o1 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return 1;
            } else {
                return -1;
            }
        } else if (o2 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return -1;
            } else {
                return 1;
            }
        }

        return o1.compareTo(o2);
    }
}

und wenn Sie immer 0 in der ComparetO () -Methode Ihres Komparators zurückgeben?Es bedeutet, dass alle Elemente "gleich sind" und es sollte keine Swapping von Orten auftreten?

Ich hatte das gleiche Problem und aufgrund der TableView-Eigenschaft, um Zellfabrik für so viele Zeilen aufzurufen, wie in der Tabelle als sichtbar ist, und nicht nur für Zeilenindizes bis zur Größe der Liste der von TableView.setItems () -Methode, IMO Es ist besser, den Summary-Wert direkt von der Zellfabrik für jede Spalte einzustellen, die sie haben muss.

Hier ist das einfache Beispiel einer solchen Zellfabrikklasse:

generasacodicetagpre.

Vorteile dieses Ansatzes sind, dass eine solche Zeile nicht an der Sortierung beteiligt ist (weil er nicht in der Liste der Tabellenelemente ist) und auch nicht wählbar ist. Zusätzlich ist mit der übergeordneten Tablatorfabrik einfach, verschiedene Hintergrundfarbe für die gesamte Zusammenfassungszeile einzustellen und es von anderen Reihen zu unterscheiden.

Diese zusätzliche Zeile ist jedoch nicht sichtbar, während Sie nach unten scrollen, da die Installation von TableView Scrolling nicht für die zusätzliche Zeile weiß, und blättern Sie nur in der letzten Zeile aus der Liste der Elemente unten im Ansichtsfenster. Dies kann durch das Überschreiben von TABLEVIEWSKIN.GETITEMCOUNT () -Methode wie im folgenden Beispiel gelöst werden. Überschreibungs-Tabellenansicht selbst ist nicht erforderlich, wird jedoch empfohlen, wenn diese Tabelle häufig verwendet wird.

generasacodicetagpre.

Dies kann wie ein Hack aussehen, funktioniert aber arbeitet wie ein Zauber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top