我有一个包含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;
}
}
要使用比较器,还必须使用内容提供程序(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有什么好处