一. 創建表格
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();
}
}