当前位置: 首页 > 知识库问答 >
问题:

排序SWT表与ViewerCompator从不调用比较

章心水
2023-03-14

我有一个包含3列的SWT表,用户应该可以对其进行排序

我检查了stackoverflow和其他站点,基于此,我现在可以单击列标题,显示asc/desc符号,但表中的所有数据都被删除,并且从未调用ViewerComparator中的compare方法。

我的代码(Dienstleister是一个简单的POJO):

package testTableSort;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import de.Dienstleister;
import de.MyComparator;

public class MyComposite extends Composite {

    public static void main(String[] args) {
        Display display = Display.getDefault();
        Shell shell = new Shell();
        MyComposite mycomp = new MyComposite(shell, SWT.NONE);
        shell.setLayout(new GridLayout(1, false));
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    private Table           table;
    private TableViewer     tableViewer;
    private MyComparator    comparator;

    public MyComposite(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL | SWT.VERTICAL));

        Composite composite = new Composite(this, SWT.NONE);
        TableColumnLayout tcl_composite = new TableColumnLayout();
        composite.setLayout(tcl_composite);

        tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION);
        table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        comparator = new MyComparator();
        tableViewer.setComparator(comparator);

        TableViewerColumn tvbNummer = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn colNummer = tvbNummer.getColumn();
        tcl_composite.setColumnData(colNummer, new ColumnPixelData(100, true, true));
        colNummer.setText("Nummer");
        colNummer.addSelectionListener(getSelectionAdapter(colNummer, 0));

        TableViewerColumn tvcName = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn colName = tvcName.getColumn();
        tcl_composite.setColumnData(colName, new ColumnPixelData(200, true, true));
        colName.setText("Name");
        colName.addSelectionListener(getSelectionAdapter(colName, 1));

        TableViewerColumn tvcBezeichnung = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn colBezeichnung = tvcBezeichnung.getColumn();
        tcl_composite.setColumnData(colBezeichnung, new ColumnPixelData(200, true, true));
        colBezeichnung.setText("Bezeichnung");
        colBezeichnung.addSelectionListener(getSelectionAdapter(colBezeichnung, 2));

        setMyData(getMyData());
    }

    private Collection<Dienstleister> getMyData() {
        Collection<Dienstleister> coll = new ArrayList<Dienstleister>();

        Dienstleister d1 = new Dienstleister();
        d1.setName("Test");
        d1.setNummer(1);
        d1.setBeschreibung("Some text");
        Dienstleister d2 = new Dienstleister();
        d2.setName("ABC");
        d2.setNummer(2);
        d2.setBeschreibung("FGH");
        Dienstleister d3 = new Dienstleister();
        d3.setName("ZYX");
        d3.setNummer(3);
        d3.setBeschreibung("HGF");

        coll.add(d1);
        coll.add(d2);
        coll.add(d3);

        return coll;
    }

    public void setMyData(Collection<Dienstleister> p_data) {
        table.removeAll();
        for (Dienstleister entity : p_data) {
            TableItem item = new TableItem(table, SWT.NULL);
            item.setData(entity);
            item.setText(0, String.valueOf(entity.getNummer()));
            item.setText(1, entity.getName());
            item.setText(2, entity.getBeschreibung());
        }
    }

    private SelectionAdapter getSelectionAdapter(final TableColumn p_column, final int p_index) {
        SelectionAdapter selectionAdapter = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comparator.setColumn(p_index);
                int dir = comparator.getDirection();
                tableViewer.getTable().setSortDirection(dir);
                tableViewer.getTable().setSortColumn(p_column);
                tableViewer.refresh();
            }
        };
        return selectionAdapter;
    }
}

和我的比较类:

package de;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import de.Dienstleister;

public class MyComparator extends ViewerComparator {
    private int                 propertyIndex;
    private static final int    DESCENDING  = 1;
    private int                 direction   = DESCENDING;

    public MyComparator() {
        this.propertyIndex = 0;
        direction = DESCENDING;
    }

    public int getDirection() {
        return direction == 1 ? SWT.DOWN : SWT.UP;
    }

    public void setColumn(int column) {
        if (column == this.propertyIndex) {
            // Same column as last sort; toggle the direction
            direction = 1 - direction;
        } else {
            // New column; do an ascending sort
            this.propertyIndex = column;
            direction = DESCENDING;
        }
    }

    @Override
    public int compare(Viewer viewer, Object e1, Object e2) {
        Dienstleister p1 = (Dienstleister) e1;
        Dienstleister p2 = (Dienstleister) e2;

        int rc = 0;
        switch (propertyIndex) {
            case 0:
                rc = Integer.valueOf(p1.getNummer()).compareTo(p2.getNummer());
                break;
            case 1:
                rc = p1.getName().compareTo(p2.getName());
                break;
            default:
                rc = 0;
        }
        // If descending order, flip the direction
        if (direction == DESCENDING) {
            rc = -rc;
        }
        return rc;
    }
}

编辑:根据greg_449提供的链接更改了代码(http://www.vogella.com/tutorials/EclipseJFaceTable/article.html)现在我得到一个异常”线程中的异常”main”org.eclipse.core.runtime.AssertionFailedException:断言失败:未知列布局数据”如果我不调用createClons方法,我得到表中pojos的toString()输出。

public class MyComposite extends Composite {
    public static void main(String[] args) {
        Display display = Display.getDefault();
        Shell shell = new Shell();
        MyComposite mycomp = new MyComposite(shell, SWT.NONE);
        shell.setLayout(new GridLayout(1, false));
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    private TableViewer     tableViewer;

    public MyComposite(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL | SWT.VERTICAL));

        Composite composite = new Composite(this, SWT.NONE);
        TableColumnLayout tcl_composite = new TableColumnLayout();
        composite.setLayout(tcl_composite);

        createViewer(composite);
    }

    private void createViewer(Composite p_composite) {
        tableViewer = new TableViewer(p_composite, SWT.BORDER | SWT.FULL_SELECTION);
        createColumns();
        final Table table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setInput(getMyData());

        GridData gridData = new GridData();
        gridData.verticalAlignment = GridData.FILL;
        gridData.horizontalSpan = 1;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;
        tableViewer.getControl().setLayoutData(gridData);
    }

    private void createColumns() {
        TableViewerColumn tvbNummer = new TableViewerColumn(tableViewer, SWT.NONE);
        tvbNummer.getColumn().setText("Nummer");
        tvbNummer.getColumn().setWidth(100);
        tvbNummer.getColumn().setResizable(true);
        tvbNummer.getColumn().setMoveable(true);

        tvbNummer.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                Dienstleister d = (Dienstleister) element;
                return d.getName();
            }
        });
    }

    private Collection<Dienstleister> getMyData() {
        Collection<Dienstleister> coll = new ArrayList<Dienstleister>();

        Dienstleister d1 = new Dienstleister();
        d1.setName("Test");
        d1.setNummer(1);
        d1.setBeschreibung("Some text");
        Dienstleister d2 = new Dienstleister();
        d2.setName("ABC");
        d2.setNummer(2);
        d2.setBeschreibung("FGH");
        Dienstleister d3 = new Dienstleister();
        d3.setName("ZYX");
        d3.setNummer(3);
        d3.setBeschreibung("HGF");

        coll.add(d1);
        coll.add(d2);
        coll.add(d3);

        return coll;
    }
}

共有1个答案

吕征
2023-03-14

要使用比较器,还必须使用内容提供程序(TableViewer.setContentProvider)和标签提供程序或列标签提供程序。

自己创建TableItems意味着TableViewer根本无法工作。使用TableViewer时,您根本不应该创建或访问TableItem对象-TableViewer为您创建和管理这些对象。

有关TableViewer使用的更多详细信息,请点击此处

 类似资料:
  • 问题内容: 我现在是一名Web开发人员,正在考虑构建我的第一个真正的桌面应用程序。这个想法是要构建一个工具,该工具可以在没有API的Web应用程序中自动执行非常重复的任务。 我知道我想使用Java。我以前在网络上使用过它,非常了解语法,并希望应用程序尽可能地跨平台。 我不确定的地方是应该使用SWT还是Swing。当我的主要受众使用Windows时,我希望在那里尽可能使用本机。Linux和Mac应该

  • 我已经阅读并理解了Mergesort的工作原理(作为文本),现在我正在尝试对其进行编码。我已经完成了分割数据的部分(我使用向量),直到它的每个大小都为1。现在我已经在Mergesort中为另一个所需部分编写了代码,我不知道该如何调用它,但我只是称它为“比较和排序部分”。 你有两个向量,这个部分应该比较最开始的元素,取较小的元素,然后删除选择的元素,把它放入一个新的向量中。这样做,直到两个向量的大小

  • “StringComparator”在“arrays.sort(b,new StringComparator());”出货量和预期的一样。 但当我使用默认排序(步骤如下),然后按“StringComparator”排序时,bug显示: “Arrays.Sort(a);Arrays.Sort(a,new StringComparator());”

  • 尝试编写一些干净的JS排序函数。下面是我的模板中一个按钮的click处理程序,它调用各个方法按不同的属性排序。 它调用下面的方法。它的工作很好,这是很好的! 我遇到的问题是,我已经有了大约4个这样的排序方法,我想把if语句放入它们自己的函数中,以便更好地编写干巴巴的代码。所以我尝试了下面的方法,但是compareFunction甚至从来没有调用过GET。我做错了什么?

  • 问题内容: 在swt中,表排序适用于Strings,如何对Integer,Double和Date值进行排序。这仅适用于字符串升序。任何人都可以提出一种更好的方法来做到这一点。 问题答案: 我修改了SWT代码段,以显示如何对具有不同数据类型的列进行排序。 总结一下, 这完全取决于程序员如何对表中的列进行排序,因为表无论它们的含义是什么,总是只需要一行String数组。

  • 我正在使用SWT创建一个新项目。我将在项目中有3或4个不同的表。我对SWT相当陌生,我发现自己在问自己是应该只使用< code >表格还是应该使用< code >表格查看器。 我想学习一些好的指导方针,告诉我什么时候只使用< code>Table以及什么时候< code>TableViewer是最佳途径。 < li >使用< code>TableViewer而不是< code>Table有什么好处