2016-04-11 10 views
2

Ich bin mir ziemlich sicher, was ich frage unmöglich ist, aber ich konnte keine definitive nicht auf die Frage überall, so geht es hier finden:Sortieren JFace Tableviewer von mehreren Spalten

Betrachten Sie das folgende Arbeitsbeispiel :

public class TableViewerSorter { 

private static final String DATA_COMPARATOR = "comparator"; 

public static void main(String[] args) { 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 

    final TableViewer viewer = new TableViewer(shell, SWT.BORDER); 
    Table table = viewer.getTable(); 
    table.setHeaderVisible(true); 
    viewer.setContentProvider(ArrayContentProvider.getInstance()); 
    viewer.setSorter(new ViewerSorter() { 

     @Override 
     public int compare(Viewer v, Object e1, Object e2) { 
      TableColumn sortColumn = table.getSortColumn(); 
      Comparator comparator = sortColumn == null ? null : (Comparator) sortColumn.getData(DATA_COMPARATOR); 
      if (comparator != null && table.getSortDirection() == SWT.UP) { 
       comparator = comparator.reversed(); 
      } 
      return comparator == null ? 0 : comparator.compare(e1, e2); 
     } 
    }); 

    createTableViewerColumn(viewer, "ID", v -> v.ordinal()); 
    createTableViewerColumn(viewer, "Name", v -> v.getDisplayName()); 
    createTableViewerColumn(viewer, "Fruit", v -> v.isFruit()); 

    for (TableColumn column : table.getColumns()) { 
     column.addListener(SWT.Selection, e -> { 
      final Item sortColumn = table.getSortColumn(); 
      int direction = table.getSortDirection(); 

      if (column.equals(sortColumn)) { 
       direction = direction == SWT.UP ? SWT.DOWN : SWT.UP; 
      } else { 
       table.setSortColumn(column); 
       direction = SWT.UP; 
      } 
      table.setSortDirection(direction); 
      viewer.refresh(); 
     }); 
    } 
    viewer.setInput(Value.values()); 

    shell.pack(); 
    shell.open(); 

    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 
} 

private static <T extends Comparable<T>> TableViewerColumn createTableViewerColumn(TableViewer viewer, String name, 
     Function<Value, T> propertyFunction) { 
    TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); 
    viewerColumn.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public String getText(Object element) { 
      return propertyFunction.apply((Value) element).toString(); 
     } 
    }); 

    TableColumn column = viewerColumn.getColumn(); 
    column.setText(name); 
    column.setWidth(100); 
    column.setData(DATA_COMPARATOR, (Comparator<Value>) (v1, v2) -> propertyFunction.apply(v1).compareTo(propertyFunction.apply(v2))); 
    return viewerColumn; 
} 

static enum Value { 
    APPLE, BANANA, CABBAGE, DILL, EGGPLANT; 

    String getDisplayName() { 
     return name().substring(0, 1) + name().substring(1).toLowerCase(); 
    } 

    boolean isFruit() { 
     return this != CABBAGE && this != DILL; 
    } 
} 

static class LabelProvider<T> extends ColumnLabelProvider { 

    private final Function<T, String> toStringFunction; 

    public LabelProvider(final Function<T, String> toStringFunction) { 
     this.toStringFunction = toStringFunction; 
    } 

    @Override 
    public String getText(final Object element) { 
     return element == null ? null : this.toStringFunction.apply((T) element); 
    } 

} 
} 

Was ich will, ist für den Benutzer die zweite Spalte klicken, um dann die dritte und haben die von der dritten Spalte sortiert Eingang, und wenn die Werte gleich sind, durch den zweiten.

Natürlich kann ich einfach eine Liste angeklickter Spalten zur ViewerSorter hinzufügen, oder (abhängig vom Sortieralgorithmus) einfach die letzte sortierte Liste von Elementen als Basis für die Sortierung anstelle der Eingabe des Betrachters verwenden.

Das ist der einfache Teil.

Der schwierige Teil ist, wie dem Benutzer mitgeteilt wird, dass diese bestimmte Tabelle nach zwei Spalten sortiert ist. Die API scheint den Anwendungsfall nicht zu unterstützen, aber ich möchte sicherstellen: Ist es möglich, dass JFace-Tabellen nach mehreren Spalten sortiert sind? Wenn das so ist, wie?

Antwort

1

Es gibt derzeit keine standardmäßige Möglichkeit, mehrere Sortierspalten anzugeben. Es gibt einen seit langem bestehenden Fehler 133154, der Unterstützung für mehrere setSortColumm Spalten anfordert, aber es wurde nie etwas unternommen.

0

Ja. greg-449 ist richtig, dass es bisher keine Standardimplementierung gibt. Wenn Sie wirklich daran interessiert sind, wie es funktioniert, habe ich einen Workaround, indem Sie TableColumn.setImage(image) verwenden und das richtige Sortierbild für die Spalte festlegen. Pflegen Sortierreihenfolge in TableColumn.setData(key,value) und alle sortierten Spalten in Table.setData(key,value) und nie verwenden oder setzen Table.setSortDirection(direction) und Table.setSortColumn().

enter image description here

+0

tun Sie Beispielcode für Ihre Abhilfe haben? –

Verwandte Themen