一. 创建表格
1. setContentProvider 主要功能:把数据转换为表格需要的数据模型,这里转换为数组。
2. setLabelProvider 主要功能:设置每个单元格显示的文本和图片。
3. setInput 主要功能:提供数据
整体上的工作过程是:setInput()提供数据,setContentProvider()把setInput()提供的数据转换为表格能用的数据类型:数组,setLabelProvider()把这些数据按照我们想要的形式显示出来。他们三者遵照MVC思想。
二. 为表格增加功能
1. 右键菜单
1.1 创建MenuManager()
1.2 设置为表格的contextMenu
2. 排序
2.1 调用TableViewer方法setSorter(Sorter sorter)为表格设置排序。
2.2 调用sorter.doSort(int column);触发排序。
3. 编辑单元格内容
3.1 setColumnProperties 主要功能:给每个列设置一个属性,相当于设置了一个名字
3.2 setCellEditors 主要功能:设置每列的单元格是什么类型的编辑框,比如文本框,组合框,下拉框。
3.3 setCellModifier 主要功能:设置当前单元格是否可编辑,改变后的值怎么处理等等。
4. 增加表格过滤
4.1 addFilter(ViewerFilter filter);
三. 其他
1. 表格中增加一行记录的方法:
TableViewer和数据模型(本例中的是List对象)中都能够增加删除一条记录,区别在于TableViewer中的方法只是在对显示界面的数据进行操作,并为改变数据模型中的数据;而直接在数据模型中增删数据需要调用TableViewer的refresh()方法才能显示出增删的数据。
2.TableViewer的update()方法与refresh()方法的区别:
前者假定输入模型结构不变,后者认为输入模型结构发生变化;所以优先调用前者,减少系统开销。
3. TableColumn类:
它用来设置表格的title,它和表格的body是分开创建的,而且树也可以创建树的title,使用TreeColumn类,这时的树就是 表格树。
4. 如何改变表格的行高:
可以通过设置单元格图片的方式,间接的使单元格变高。
四.主要代码示例
1. 主类
/**
* @description:
* @author Administrator
* @version 1.0, 2010-2-19
* @Copyright 2010-2020
*/
public class MyEditor extends EditorPart {
public static final String ID = "rcptest.editors.MyEditor";
public static final String[] COLUMN_NAME = { "ID", "NAME", "SEX", "COLOR" };
private TableViewer table;
private List persons;
public MyEditor() {
super();
}
@Override
public void doSave(IProgressMonitor monitor) {
// TODO Auto-generated method stub
}
@Override
public void doSaveAs() {
// TODO Auto-generated method stub
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
// TODO Auto-generated method stub
this.setSite(site);
this.setInput(input);
this.setPartName(input.getName());
}
@Override
public boolean isDirty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isSaveAsAllowed() {
// TODO Auto-generated method stub
return false;
}
//创建表格的代码
@Override
public void createPartControl(Composite parent) {
// TODO Auto-generated method stub
persons = new ArrayList();
persons.add(new PersonEO(1, "你好", "man", "black"));
persons.add(new PersonEO(2, "wang", "man", "black"));
table = new TableViewer(parent, SWT.FULL_SELECTION);
for (int i = 0; i < 4; i++) {
new TableColumn(table.getTable(), SWT.LEFT).setText("title" + i);
table.getTable().getColumn(i).pack();
}
table.getTable().setHeaderVisible(true);
table.getTable().setLinesVisible(true);
table.setContentProvider(new MyContentProvider());
table.setLabelProvider(new MyLabelProvider());
table.setInput(persons);
// add context menu
this.createContextMenu();
// enable table edit
this.editor();
// add sortor
this.sorter();
}
private void sorter() {
table.setSorter(new Sorter());
TableColumn column = table.getTable().getColumn(0);
column.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
((Sorter) table.getSorter()).doSort(1);
table.refresh();
}
});
}
private void editor() {
table.setColumnProperties(COLUMN_NAME);
CellEditor[] editors = new CellEditor[4];
editors[0] = new TextCellEditor(table.getTable());
editors[1] = new TextCellEditor(table.getTable());
editors[2] = new TextCellEditor(table.getTable());
editors[3] = new TextCellEditor(table.getTable());
table.setCellEditors(editors);
table.setCellModifier(new TableCellModifier());
}
private void createContextMenu() {
MenuManager menu = new MenuManager();
menu.add(new AddAction(table, persons));
menu.add(new DelAction(table));
menu.add(new RefreshAction(table));
menu.add(new FileterAction(table));
Menu m = menu.createContextMenu(table.getControl());
table.getTable().setMenu(m);
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
class MyContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
// TODO Auto-generated method stub
return ((List) inputElement).toArray();
}
public void dispose() {
// TODO Auto-generated method stub
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
}
class MyLabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
// TODO Auto-generated method stub
return null;
}
public String getColumnText(Object element, int columnIndex) {
// TODO Auto-generated method stub
PersonEO person = (PersonEO) element;
if (columnIndex == 0)
return person.getID() + "";
if (columnIndex == 1)
return person.getName();
if (columnIndex == 2)
return person.getGender();
if (columnIndex == 3)
return person.getColor();
return null;
}
public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
public void dispose() {
// TODO Auto-generated method stub
}
public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}
public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
}
}
2. 排序类
/**
* @description:
* @author Administrator
* @version 1.0, 2010-2-19
* @Copyright 2010-2020
*/
public class Sorter extends ViewerSorter {
private static final int ASC = 0;
private static final int DES = 1;
private int order;
private int column;
public void doSort(int column) {
if (column == this.column)
order = 1 - order;
else {
this.column = column;
order = DES;
}
}
@Override
protected Comparator getComparator() {
// TODO Auto-generated method stub
return super.getComparator();
}
public int compare(Viewer viewer, Object e1, Object e2) {
int result = 0;
PersonEO p1 = (PersonEO) e1;
PersonEO p2 = (PersonEO) e2;
switch (column) {
case 1:
result = p1.getID() > p2.getID() ? 1 : -1;
break;
case 2:
result = collator.compare(p1.getName(), p2.getName());
break;
case 3:
result = collator.compare(p1.getGender(), p2.getGender());
break;
case 4:
result = collator.compare(p1.getColor(), p2.getColor());
break;
}
if (order == DES)
result = -result;
return result;
}
}
3. CellModifier类
/**
* @description: 编辑单元格内容
* @author Administrator
* @version 1.0, 2010-2-19
* @Copyright 2010-2020
*/
public class TableCellModifier implements ICellModifier{
public boolean canModify(Object element, String property) {
// TODO Auto-generated method stub
return true;
}
public Object getValue(Object element, String property) {
// TODO Auto-generated method stub
return "...";
}
public void modify(Object element, String property, Object value) {
// TODO Auto-generated method stub
}
}
4. filter类
/**
* @description:表格过滤
* @author Administrator
* @version 1.0, 2010-2-19
* @Copyright 2010-2020
*/
public class FileterAction extends Action {
ViewerFilter filter;
TableViewer table;
public FileterAction(TableViewer table){
this.table = table;
this.setText("filter");
filter = new ViewerFilter(){
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
// TODO Auto-generated method stub
PersonEO p = (PersonEO)element;
return p.getGender().equals("women");
}
};
this.setChecked(false);
}
public void run(){
if(this.isChecked())
table.addFilter(filter);
else
table.removeFilter(filter);
table.refresh();
}
}