# JTable sortieren



## =fire= (28. Dezember 2010)

Hallo,

ich habe ein AbstractTableModel erstellt. Leider weiß ich nicht wie ich der Tabelle sagen kann das Sie sich durch klick auf die Spalte selbst sortieren soll.

Habe mir schon das Tutorial auf der Sun Seite angesehen, aber anscheind geht das so nicht.
http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting


```
JTable table = new JTable();
table.setAutoCreateRowSorter(true);
```

Diese Methode gibt es bei mir nicht. 

Gruß Simon


----------



## benjamin10 (28. Dezember 2010)

Hallo,

das liegt vermutlich daran, dass du ne ältere Java-Version hast. Meines Wissens steht die Methode erst ab Java 1.6 zur Verfügung.

Schau mal hier:

http://www.tutorials.de/swing-java2d-3d-swt-jface/190669-defaulttablemodel-jtable-sortieren.html

Grüße

Ben


----------



## =fire= (28. Dezember 2010)

Hallo,

ich vemute eher das es diese Methode seit Java 1.6 nicht mehr gibt. Habe eben noch mal ein Update gemacht. Ich habe aber 1.6.x

Gruß Simon


----------



## Akeshihiro (28. Dezember 2010)

Die Methode setAuotCreateRowSorter() existiert nach wie vor und funktioniert auch, das kann ich euch versichern.


----------



## AttilaF (28. Dezember 2010)

Ein elementarer Beispiel dafür:

```
Object[][] data = {{"cccc","qqqq","jjjjj"},{"aaaa","dddd","ffff"}};
Object[] column = {"1","2","3"};
JTable tab = new JTable(data, column);
tab.setAutoCreateRowSorter(true);
```
Probiere, ob es funktioniert.


----------



## benjamin10 (28. Dezember 2010)

Hallo,

in so einem Fall lohnt es sich auch, die API zu lesen. Und da sieht man unter anderem, dass die besagte Methode seit Java 1.6 existiert:

http://download.oracle.com/javase/6/docs/api/javax/swing/JTable.html#setAutoCreateRowSorter(boolean)

Unter Java 1.5 gibts diese Funktion beispielsweise nicht. Siehe:

http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/JTable.html

Aber theoretisch kannst du es auch ohne die Methode lösen und einfach selbst programmieren. Schau dir dafür einfach mal den Post an:

http://www.tutorials.de/swing-java2...lttablemodel-jtable-sortieren.html#post989536

Gruß Ben


----------



## Akeshihiro (28. Dezember 2010)

Ich sag doch, dass es funktioniert.

Kann es sein, dass du die JTable vielleicht direkt in deine Gui einfügst, ohne sie erst in eine JScrollPane zu packen. Denn das sollte man sinnvollerweise tun, nicht nur zum Scrollen, sondern auch wegen den Headern und erst wenn diese vorhanden sind, kann man auch die Tabelle sortieren.


----------



## benjamin10 (28. Dezember 2010)

Naja, die Symptome waren ja nicht, dass irgendwas nicht funktioniert wie beispielsweise fehlende Spaltenheader. Er schreibt ja, dass es die Methode bei ihm schlichtweg nicht gibt, also in der IDE vermutlich rot unterkringelt wird.

Drum würde mich mal interessieren, auf welche Java-Plattform dein Eclipse oder Netbeans zurückgreift. Weil es nützt ja nix, wenn man beispielsweise nur die Java-Runtime-Environment auf 1.6 updated, aber mit nem 1.5er SDK entwickelt.


Gruß Ben


----------



## =fire= (29. Dezember 2010)

Hallo,

ich benutzte eclipse, dort wie erwähnt diese Methode nicht akzeptiert. Ich habe im Programme Ordner unter Java die jdk1.6.0_23 liegen. Kann ich sehen worauf eclipse zurückgreift?

Habe das jetzt aber anders gelöst. Nur klappt bei mir der Sortier Algorithmus nicht. 

this.list ist meine ArrayList, zwei Dimensional. Darin Enthalten sind Strings und Int, leider weiß ich nicht wie ich diesen Code anpassen kann. Geht das auch einfacher? 

```
public void sortByColumn(final int clm) {
        Collections.sort(this.list, new Comparator() {
            public int compare(Object o1, Object o2) {
                Vector v1 = (Vector) o1;
                Vector v2 = (Vector) o2;

                int size1 = v1.size();
                if (clm >= size1)
                    throw new IllegalArgumentException("max column idx: "+ size1);

                Comparable c1 = (Comparable) v1.get(clm);
                Comparable c2 = (Comparable) v2.get(clm);

                int cmp = c1.compareTo(c2);

                if (sortColumnDesc[clm]) {
                    cmp *= -1;
                }

                return cmp;
            }
        });
        this.sortColumnDesc[clm] ^= true;
    }
```


----------



## MiMi (29. Dezember 2010)

Du kannst in Eclipse ganz einfach oben im Menu unter Projekt->Properties->java compiler sehen welche Version dein Eclipse nutzt  Bzw welche Version fuer das Projekt eingestellt ist


----------



## =fire= (30. Dezember 2010)

Firesimon hat gesagt.:


> Hallo,
> 
> ich benutzte eclipse, dort wie erwähnt diese Methode nicht akzeptiert. Ich habe im Programme Ordner unter Java die jdk1.6.0_23 liegen. Kann ich sehen worauf eclipse zurückgreift?
> 
> ...


 
Kann mir jemand dazu helfen? Das klappt nicht.


----------



## AttilaF (30. Dezember 2010)

mit Comparator ginge es so:


```
Object[][] data = {{"ggggg",1},{"aaaaa",3},{"bbbbb",2}};
Object[] column = {"A","B"};
JTable tab = new JTable(data,column);
TableRowSorter sorter = new TableRowSorter(tab.getModel());
tab.setRowSorter(sorter);
sorter.setComparator(0, new MyStringComparator());
sorter.setComparator(1, new MyIntegerComparator());
//...

   class MyStringComparator implements Comparator<String> {
        public int compare(String o1, String o2) {
            return (o1.compareTo(o2));
        }
   }

   class MyIntegerComparator implements Comparator<Integer> {
        public int compare(Integer o1, Integer o2) {
            return o1.compareTo(o2);
        }
   }
}
```


----------



## =fire= (30. Dezember 2010)

Danke, das funktioniert.

Eine kleine Frage noch, ich habe einen TabeleCellRenderer der mir Pfeile für die Sortierungsrichtung setzt, wie kann ich schauen in welche Richtung zur Zeit sortiert wird? 

sorter.getComparator?


----------



## AttilaF (30. Dezember 2010)

Es ist ein wenig komplizierter  


```
sorter.addRowSorterListener(new RowSorterListener(){
    public void sorterChanged(RowSorterEvent e) {
        RowSorter tSorter = (RowSorter)e.getSource();
        List<? extends RowSorter.SortKey> sortKeys = tSorter.getSortKeys();
        String sortOrder = sortKeys.get(0).getSortOrder().toString();
       // die aktuelle Sortierrichtung
    }
});
```
... aber es ist nicht die ganz korrekte, hundertprozentige Lösung.


----------



## =fire= (31. Dezember 2010)

Hallo,

irgendwie verstehe ich das nicht ganz. Meine TableCellRenderer sieht so aus.


```
table.getTableHeader().setDefaultRenderer(
                new DefaultTableCellRenderer() {
                	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                        JTableHeader header = table.getTableHeader();

                        setText(value == null ? "" : value.toString());
                        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
                        setHorizontalAlignment(SwingConstants.CENTER);
                        setHorizontalTextPosition(SwingConstants.LEFT);
                                                
                        if (view.sortColumnDesc[column]) {
                            setIcon(new ImageIcon(getClass().getResource("http://www.tutorials.de/images/up.png")));
                        } else {
                            setIcon(new ImageIcon(getClass().getResource("http://www.tutorials.de/images/down.png")));
                        }
                        
 

                        return this;
                    }
         });
```


----------



## AttilaF (31. Dezember 2010)

Meine vorige Lösung zeigte nur, wie könnten wir die aktuelle Sortierrichtung abfragen (übrigens sie ist im Header automatisch dargestellt). Ich habe eine andere Lösung in diesem Buch auf der Seite 321-322 gefunden: http://books.google.de/books?id=Ojk25QoiTrYC&printsec=frontcover#v=onepage&q&f=false
Vielleicht es wird die Lösung.

Bitte, entschuldige mein Deutsch, ich bin kein Deutscher.


----------



## AttilaF (31. Dezember 2010)

...und auch auf der Seite 318-321.


----------

