JavaFX Im TreeView, TreeItems sortieren

Ingerten

Bekanntes Mitglied
Hallo zusammen,

Ich habe da ein kleines Problem und komme da nicht weiter, ich möchte meine Items im Treeview wie folgt sortieren.

bis jetzt ist es so:

Ordner 1
Ordner 11
Ordner 2

ich hätte es aber gerne so:

Ordner 1
Ordner 2
Ordner 11

Ich adde die Nodes in eine "ObservableList<TreeItem<PathItem>>" und die muss man doch irgendwie sortieren können oder geht das garnicht mit der "ObservableList"?

Vielen Dank schonmal.
 

knilch

Bekanntes Mitglied
Hi,
Du kannst eine Liste mit Collections.sort bzw. FXCollections.sort (für ObservableList) sortieren.
hier mal ein Beispiel für eine Observable list:
Java:
private static void sortMyList() {
   ObservableList<String> myList = FXCollections.observableList(new LinkedList<>());
   myList.addAll("Ordner 2", "Ordner 11", "Ordner 7", "Ordner 6", "Ordner 1" );
   System.out.println("vor sortieren");
   myList.forEach(item -> {
     System.out.println(item);
   });
   FXCollections.sort(myList, new Comparator<String>() {
     @Override
     public int compare(String string0, String string1) {
       int number0 = Integer.parseInt(string0.replace("Ordner ", ""));
       int number1 = Integer.parseInt(string1.replace("Ordner ", ""));
       if(number0 > number1)
         return 1;
       if(number0 < number1)
         return -1;
       else
         return 0;
     }
   });
   System.out.println("nach sortieren");
   myList.forEach(item -> {
     System.out.println(item);
   });
}
Code:
vor sortieren
Ordner 2
Ordner 11
Ordner 7
Ordner 6
Ordner 1
nach sortieren
Ordner 1
Ordner 2
Ordner 6
Ordner 7
Ordner 11
Hier noch ein paar Anmerkungen:
Das "Problem" beim Sortieren von Namen, bei denen auch noch ein Index berücksichtigt werden soll, ist, dass eine Zahl in einem String als Charakter angesehen wird, damit wird bei der Sortierung Ordner 1, Ordner 11 und dann erst Ordner 2 sortiert.
Da du aber den nach dem Index im Namen sortieren möchtest, muss die Sortierung der Liste auch mit dem Index gemacht werden.
Dazu wird im Code das Comparator-Interface benutzt. Mit diesem wird der String: "Ordner ", der für alle Items gleich ist, entfernt. Damit bleibt nur noch eine Nummer als String. Diese wird dann als int geparsed und dann wird der Vergleich mit den 2 Nummer gemacht.
Das ganze funktioniert jedoch nur solange, wie die Verzeichnisse mit "Ordner " anfangen und dann eine Zahl folgt. Wenn nach der Zahl wieder andere Charakter folgenen, fliegt das ganze hoch... NumberFormatException.
Besser wäre vielleicht, wenn du mit Regex den Index ermittelst.
 
Zuletzt bearbeitet:

Ingerten

Bekanntes Mitglied
Vielen Dank erstmal, ich mal schauen, ob ich da was hinbekomme.

Leider ist es genau so, wie du es als letztes beschrieben hast, es könnte eben vorkommen, das die Zahl überall stehen könnte oder es gibt keine Zahl.
Im Prinzip soll die sortierung genau wie im Windows-Explorer aussehen.
 

Ingerten

Bekanntes Mitglied
Juhu, ich habs hinbekommen.

Google hat doch noch was gefunden, hier die Lösung und für mein Projekt etwas abgeändert.
Und vielen Dank nochmal, für deine hilfe.

Java:
            Collections.sort(children, new Comparator<TreeItem<PathItem>>() {
                private final Comparator<String> NATURAL_SORT = new WindowsExplorerComparator();

                @Override
                public int compare(TreeItem<PathItem> o1, TreeItem<PathItem> o2) {;
                    return NATURAL_SORT.compare(o1.getValue().toString(), o2.getValue().toString());
                }
            });

Java:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WindowsExplorerComparator implements Comparator<String> {

    private static final Pattern splitPattern = Pattern.compile("\\d+|\\.|\\s");

    @Override
    public int compare(String str1, String str2) {
        Iterator<String> i1 = splitStringPreserveDelimiter(str1).iterator();
        Iterator<String> i2 = splitStringPreserveDelimiter(str2).iterator();
        while (true) {
            //Til here all is equal.
            if (!i1.hasNext() && !i2.hasNext()) {
                return 0;
            }
            //first has no more parts -> comes first
            if (!i1.hasNext() && i2.hasNext()) {
                return -1;
            }
            //first has more parts than i2 -> comes after
            if (i1.hasNext() && !i2.hasNext()) {
                return 1;
            }

            String data1 = i1.next();
            String data2 = i2.next();
            int result;
            try {
                //If both datas are numbers, then compare numbers
                result = Long.compare(Long.valueOf(data1), Long.valueOf(data2));
                //If numbers are equal than longer comes first
                if (result == 0) {
                    result = -Integer.compare(data1.length(), data2.length());
                }
            } catch (NumberFormatException ex) {
                //compare text case insensitive
                result = data1.compareToIgnoreCase(data2);
            }

            if (result != 0) {
                return result;
            }
        }
    }

    private List<String> splitStringPreserveDelimiter(String str) {
        Matcher matcher = splitPattern.matcher(str);
        List<String> list = new ArrayList<String>();
        int pos = 0;
        while (matcher.find()) {
            list.add(str.substring(pos, matcher.start()));
            list.add(matcher.group());
            pos = matcher.end();
        }
        list.add(str.substring(pos));
        return list;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX TreeView - TreeItem - SelectedItem AWT, Swing, JavaFX & SWT 7
W JavaFX JavaFX - TreeView will nicht AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX Icons im TreeView werden nicht angezeigt AWT, Swing, JavaFX & SWT 1
L JavaFX TreeView aufstellen läuft irgendwie auf Endlosschleife AWT, Swing, JavaFX & SWT 3
L JavaFX TreeView Edit Mode über F2 AWT, Swing, JavaFX & SWT 13
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
D JavaFX TreeView stylen AWT, Swing, JavaFX & SWT 6
L JavaFX TreeView mit File Objects AWT, Swing, JavaFX & SWT 0
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
B TreeView cellFactory AWT, Swing, JavaFX & SWT 4
D javafx.scene.control.TreeView als dropdown Menü AWT, Swing, JavaFX & SWT 6
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
I JavaFX TreeView Pfeil nicht mehr Klickbar machen AWT, Swing, JavaFX & SWT 1
B JavaFX Wie Treeview aus xml erzeugen AWT, Swing, JavaFX & SWT 11
B Convert Treeview to XML AWT, Swing, JavaFX & SWT 9
N JavaFX TreeView mit verschiedenen Datentypen AWT, Swing, JavaFX & SWT 8
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
agent47 JavaFX TreeView Struktur dynamisch einlesen AWT, Swing, JavaFX & SWT 1
Tom299 JavaFX TreeView Expanded-Icon ändern AWT, Swing, JavaFX & SWT 0
ToBJo JavaFX TreeView zerstört sich selbst AWT, Swing, JavaFX & SWT 1
G JavaFX TreeView stylen AWT, Swing, JavaFX & SWT 2
G JavaFX TreeView AWT, Swing, JavaFX & SWT 3
G Problem mit TreeView AWT, Swing, JavaFX & SWT 2
L TreeViewerColumn - gesamte TreeView-breite nutzen? AWT, Swing, JavaFX & SWT 5
T SWT Treeview größe ändern AWT, Swing, JavaFX & SWT 2
C SWT Error/Warnings in TreeView AWT, Swing, JavaFX & SWT 2
P Eindeutiger Knoten im Treeview AWT, Swing, JavaFX & SWT 3
K SystemIcons v. Dateien & Verz. im TreeView anzeigen AWT, Swing, JavaFX & SWT 2
T SWT - Text eines TreeItems nachträglich ändern AWT, Swing, JavaFX & SWT 6
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
C Polygon Koordinaten richtig sortieren AWT, Swing, JavaFX & SWT 7
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
K Swing Selectedrows falsch nach Sortieren AWT, Swing, JavaFX & SWT 1
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
M Zufallszahlen sortieren AWT, Swing, JavaFX & SWT 6
maestr0 Treeviewer nach Kategorien sortieren AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
K Probleme bei sortieren von jTable AWT, Swing, JavaFX & SWT 5
F Tabelle sortieren AWT, Swing, JavaFX & SWT 3
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
S Tabelle sortieren, mit Ausnahme der letzten Zeile AWT, Swing, JavaFX & SWT 9
T Swing 2 Tabellen parallel sortieren? (synchronisieren) AWT, Swing, JavaFX & SWT 3
B setRowFilter sortieren nach 2 Kriterien AWT, Swing, JavaFX & SWT 4
A JTable- sortieren lassen AWT, Swing, JavaFX & SWT 10
C Swing JTable sortieren AWT, Swing, JavaFX & SWT 3
A SWT Tabelle (elegant) sortieren AWT, Swing, JavaFX & SWT 2
G JTable sortieren AWT, Swing, JavaFX & SWT 2
A SWT Tabelle Sortieren AWT, Swing, JavaFX & SWT 3
C JList: Sortieren von Zahlen AWT, Swing, JavaFX & SWT 4
P Dynamisch Sortieren AWT, Swing, JavaFX & SWT 2
D Swing Tabelle sortieren AWT, Swing, JavaFX & SWT 4
N Listen in JTable sortieren AWT, Swing, JavaFX & SWT 3
D mehrere JLabel sortieren AWT, Swing, JavaFX & SWT 10
M SWT TableItems mit DND sortieren AWT, Swing, JavaFX & SWT 3
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
E JTable sortieren AWT, Swing, JavaFX & SWT 3
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
S JTable sortieren AWT, Swing, JavaFX & SWT 17
pinerski Swing JList merkwürdiges Verhalten beim sortieren AWT, Swing, JavaFX & SWT 3
O Tabelle über Event sortieren AWT, Swing, JavaFX & SWT 4
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
G JTable sortieren mit eigenem Sortieralgorithmus AWT, Swing, JavaFX & SWT 3
G SWT-Table sortieren AWT, Swing, JavaFX & SWT 12
M JTable sortieren AWT, Swing, JavaFX & SWT 7
B [JTable] kein Sortieren der versteckten Columns AWT, Swing, JavaFX & SWT 9
K Zufallszahlen, in einem Diagramm sortieren. AWT, Swing, JavaFX & SWT 39
G JTable sortieren (Java 1.5) AWT, Swing, JavaFX & SWT 4
S Daten von DefaultTableModel sortieren AWT, Swing, JavaFX & SWT 3
G JTable nach RowHeader-Werten sortieren AWT, Swing, JavaFX & SWT 2
F JTable Spalte sortieren mit lauter JComboboxen ? AWT, Swing, JavaFX & SWT 15
G Tabellenspalten als IntegerWert sortieren AWT, Swing, JavaFX & SWT 7
T JTable Sortieren AWT, Swing, JavaFX & SWT 2
P Double-Werte sortieren mit TableRowSorter AWT, Swing, JavaFX & SWT 2
G Wie komme ich an die richtigen daten nach dem sortieren? AWT, Swing, JavaFX & SWT 6
I JMenuBar - Menüs sortieren AWT, Swing, JavaFX & SWT 2
E JTable sortieren und synchronisieren von zwei Datenvektoren AWT, Swing, JavaFX & SWT 2
L JTable (DefaultTableModel) nach Spalte sortieren-TableSorter AWT, Swing, JavaFX & SWT 2
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
G JTable sortieren durch click im Header AWT, Swing, JavaFX & SWT 9
G JList sortieren AWT, Swing, JavaFX & SWT 7
C JTable sortieren nach Alphabet AWT, Swing, JavaFX & SWT 35
G Zellen in JTable alphabetisch sortieren AWT, Swing, JavaFX & SWT 13
P JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 15
G Inahlt von JTable sortieren AWT, Swing, JavaFX & SWT 2
G JTree sortieren AWT, Swing, JavaFX & SWT 2
A JTable sortieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben