SWT Wie verwende ich den RowSorter?

NochNixBlicker

Bekanntes Mitglied
Habe viel ausprobiert und bin langsam frustriert! Es wird einfach nicht initial sortiert:

Java:
package einsatz;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import java.awt.GridLayout;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TriBsp extends JPanel {

  /**
    *
    */
   private static final long serialVersionUID = 1L;

public TriBsp() {
  String rowData[][] = { { "x-MAN", "3860", "0,8762", "0,153", "198", "Ironman-Langdistanz (DTU Langdistanz)" },
  { "x-MAN", "1900", "0,7858", "0,1446", "195", "Ironman-Half" },
  { "LM", "1500", "0,867", "0,1689", "99",
  "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
  { "LM", "750", "0,9109", "0,1845", "27",
  "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
  { "BL", "1500", "1,0593", "0,157", "50",
  "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
  { "BL", "750", "0,984", "0,2327", "38",
  "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
  { "BL", "400", "1,0057", "0,1889", "22",
  "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
  { "BL", "200", "0,6951", "0,0855", "4", "DTU-Schüler-Triathlon B (10-11)" },
  { "BL", "100", "0,4266", "0,0741", "4", "DTU-Schüler-Triathlon C (8-9)" },
  { "BL/LL", "1500", "2,7244", "0,1614", "11",
  "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
  { "BL/LL", "750", "1,2424", "0,2117", "69",
  "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
  { "BL/LL", "400", "1,0225", "0,1637", "77",
  "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
  { "BL/LL", "200", "0,5373", "0,0514", "40", "DTU-Schüler-Triathlon B (10-11)" },
  { "LL/KL/RL", "2000", "0,8676", "0,151", "755", "DTU-AK20++ mittel (20-99)" },
  { "LL/KL/RL", "1500", "0,8115", "0,172", "2079",
  "DTU-Junioren-Triathlon lang (18-19) - DTU-Elite-Triathlon (18-19) - DTU-AK20++ kurz (20-99) - ITU-Kurzdistanz (olympische Distanz) - Jedermann" },
  { "LL/KL/RL", "750", "0,7209", "0,1731", "1672",
  "DTU-Jugend-Triathlon A (16-17) - DTU-Junioren-Triathlon kurz (18-19) - ITU-Sprintdistanz - Schnupper" },
  { "LL/KL/RL", "400", "0,3002", "0,0455", "244",
  "DTU-Schüler-Triathlon A (12-13) - DTU-Jugend-Triathlon B (14-15) - DTU Fitness" },
  { "LL/KL/RL", "200", "0,8977", "0,1992", "39", "DTU-Schüler-Triathlon B (10-11)" } };
  String[] columnNames = { "Liga", "Strecke", "mue", "sigma", "n", "Bezeichnung bzw AK" };

  DefaultTableModel model = new DefaultTableModel(rowData, columnNames);
  JTable table = new JTable(model);
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

  DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
  rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
   
  table.setRowSelectionAllowed(true);
  table.setColumnSelectionAllowed(false);
   
  table.setAutoCreateRowSorter(true);
   
  List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
  sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
  sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
   
  final int INDEX_COLUMN1 = 0;
  TableColumn col = table.getColumnModel().getColumn(INDEX_COLUMN1);
  col.setPreferredWidth(75);

  final int INDEX_COLUMN2 = 1;
  TableColumn col2 = table.getColumnModel().getColumn(INDEX_COLUMN2);
  col2.setPreferredWidth(50);
  table.getColumnModel().getColumn(1).setCellRenderer(rightRenderer);

  final int INDEX_COLUMN3 = 2;
  TableColumn col3 = table.getColumnModel().getColumn(INDEX_COLUMN3);
  col3.setPreferredWidth(45);

  final int INDEX_COLUMN4 = 3;
  TableColumn col4 = table.getColumnModel().getColumn(INDEX_COLUMN4);
  col4.setPreferredWidth(45);

  final int INDEX_COLUMN5 = 4;
  TableColumn col5 = table.getColumnModel().getColumn(INDEX_COLUMN5);
  col5.setPreferredWidth(35);
  table.getColumnModel().getColumn(4).setCellRenderer(rightRenderer);

  final int INDEX_COLUMN6 = 5;
  TableColumn col6 = table.getColumnModel().getColumn(INDEX_COLUMN6);
  col6.setPreferredWidth(820);
  setLayout(new GridLayout(0, 1, 0, 0));

  JScrollPane scrollPane = new JScrollPane(table);
  this.add(scrollPane);
  }
}
 
Danke Harry, aber wo muss der Befehl hin? Weil wenn ich so codiere:
Java:
  List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
  sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
  sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
  table.getRowSorter().setSortKeys(sortKeys);
Dann passiert logischerweise? das hier:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
   at einsatz.TriBsp.<init>(TriBsp.java:76)
   at einsatz.Tri.<init>(Tri.java:47)
   at GIzEH.actionPerformed(GIzEH.java:119)
   at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
   at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
   at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
   at javax.swing.AbstractButton.doClick(Unknown Source)
   at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
   at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
   at java.awt.Component.processMouseEvent(Unknown Source)
   at javax.swing.JComponent.processMouseEvent(Unknown Source)
   at java.awt.Component.processEvent(Unknown Source)
   at java.awt.Container.processEvent(Unknown Source)
   at java.awt.Component.dispatchEventImpl(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
   at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
   at java.awt.Container.dispatchEventImpl(Unknown Source)
   at java.awt.Window.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.awt.EventQueue.access$500(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.awt.EventQueue$3.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
   at java.awt.EventQueue$4.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)
 
Ja die NullPointerException ist logisch.
Du musst natürlich auch erst ein TableRowSorter Objekt erstellen und dem JTable hinzufügen. (Wie das funktioniert siehst du im Link oben ....)
 
Danke Männer, ich kümmere mich morgen darum. Bin jetzt einfach zu müde!

Was mich wirklich interessieren würde, gibt es in Java auch ein IchMussJetztSchlafenSonstFabriziereIchNurMüll Objekt? 😀
Gut N8!
 
Zuletzt bearbeitet:
Ich wette , dass du die Zeile
Java:
table.setAutoCreateRowSorter(true);
gelöscht hast. Wenn die Zeile da steht, sollte nämlich eine TableRowSorter automatisch erstellt werden.
 
Richtig gewettet!
Jetzt klappts insoweit dass er nach Buchstaben sortiert. Aber die 2. Spalte soll er ja nummerisch Sortieren, brauch ich da nun einen Cast oder muss ich eine eigene Sortierreihenfolge schreiben?
 
brauch ich da nun einen Cast
Nein, da du ein String-Objekt (und deine Tabelle besteht trotz wiederholter Hinweise auf ein eigenes TableModel nun mal aus Strings) nicht zu einer Number casten kannst.
oder muss ich eine eigene Sortierreihenfolge schreiben
Nein, höchstens einen Sortieralgorithmus. Und auch das ist unnötig. Eine JTable erstellt als RowSorter eine Instanz von TableRowSorter, und dieser verfügt über die Möglichkeit, durch spaltenspezifische Comparatoren eine benutzerdefinierte Sortierung zu erreichen. So z. B.
Java:
  TableRowSorter sorter = (TableRowSorter)table.getRowSorter();
  List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
  sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
  sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
  sorter.setSortKeys(sortKeys);
  sorter.setComparator(1, new Comparator<String>() {
      public int compare(String name1, String name2) {
          try {
              int v1 = Integer.parseInt(name1);
              int v2 = Integer.parseInt(name2);
              return v1 - v2;
          } catch (NumberFormatException nfe) {
              return name1.compareTo(name2);
          }
      }
  });
  sorter.sort();
 

Zurück
Oben