1,簡單顯示,表格的式樣見注釋中的內容
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;


public class TestTableViewer
{
private static Table table;

/** *//**
* Launch the application
* @param args
*/

public static void main(String[] args)
{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
//注意這里,SWT.NULTI代表可以選擇多行,SWT.FULL_SELECTION代表可以整行選擇,SWT.BORDER邊框,SWT.V_SCROLL ,SWT.H_SCROLL滾動條
final TableViewer tableViewer = new TableViewer(shell, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL);
table = tableViewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setBounds(97, 79, 373, 154);

final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE);
newColumnTableColumn.setWidth(39);
newColumnTableColumn.setText("ID");

final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE);
newColumnTableColumn_1.setWidth(85);
newColumnTableColumn_1.setText("姓名");
final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE);
newColumnTableColumn_2.setWidth(41);
newColumnTableColumn_2.setText("性別");

final TableColumn newColumnTableColumn_3 = new TableColumn(table, SWT.NONE);
newColumnTableColumn_3.setWidth(43);
newColumnTableColumn_3.setText("年齡");

final TableColumn newColumnTableColumn_4 = new TableColumn(table, SWT.NONE);
newColumnTableColumn_4.setWidth(126);
newColumnTableColumn_4.setText("創建日期");
shell.open();

while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
}
}
2,加入布局
顯示的效果不好,我們要加入布局,讓view填充整個畫面在shell.open()后加上
ok,效果達到
3,為TableViewer加上數據,光突突的樣子不好看。這里是demo所以不再從數據庫里邊取數據了。自己構造一個List用來做數據。實際使用中也是這么使用,不過不同的是這里是隨意構造的list,而顯示實際使用中是從數據庫取出數據構造list.
(1)構造一個people類,同時給People類提供一個構造假數據的方法getPeople()
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class People
{
private Long id;
private String name;
private String sex;
private Integer age;
private Date createDate;

public People(Long id,String name,String sex,Integer age,Date createDate)
{
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.createDate = createDate;
}

public Integer getAge()
{
return age;
}

public void setAge(Integer age)
{
this.age = age;
}

public Date getCreateDate()
{
return createDate;
}

public void setCreateDate(Date createDate)
{
this.createDate = createDate;
}

public Long getId()
{
return id;
}

public void setId(Long id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String getSex()
{
return sex;
}

public void setSex(String sex)
{
this.sex = sex;
}

public static List getPeople()
{
List list = new ArrayList();
int n = 30;

for(int i=1;i<n;i++)
{
Long id = new Long(i);
String name = "張"+i;
String sex = "男";

if((i%2) == 0)
{
sex = "女";
}
Integer age;

if(i<10)
{
age = new Integer(i*10);

}else if(i>10 && i<100)
{
age = new Integer(i);

}else if(i>100 && i<1000)
{
age = new Integer(i/10);

}else
{
age = new Integer(22);
}
Date createDate = new Date();
People people = new People(id,name,sex,age,createDate);
list.add(people);
}
return list;
}
}
(2)給tableViewer提供內容器(IStructuredContentPorvider)和標簽器(ITableLabelProvider)
如果想一個tableviewer顯示數據,那必須給它提供內容器和標簽器,內容器的作用是從List(也可以是其他的集合類)中提取出一個對象(例如People對應著表格的一行,數據庫的一條記錄),標簽器的作用是從一個對象中提取出一個字段(例如年齡,對應著表格中的一個單元格,數據庫中某一列的一個值)下邊是內容器和標簽器的代碼:
內容器:
import java.util.List;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;


public class ContentProvider implements IStructuredContentProvider
{

public Object[] getElements(Object inputElement)
{

if(inputElement instanceof List)
{
return ((List)inputElement).toArray();

}else
{
return new Object[0];
}
}

public void dispose()
{
}

public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
}
標簽器:
import java.text.SimpleDateFormat;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;


public class TableLabelProvider extends LabelProvider implements ITableLabelProvider
{

public String getColumnText(Object element, int columnIndex)
{

if (element instanceof People)
{
People p = (People)element;

if(columnIndex == 0)
{
return p.getId().toString();

}else if(columnIndex == 1)
{
return p.getName();

}else if (columnIndex ==2)
{
return p.getSex();

}else if (columnIndex == 3)
{
return p.getAge().toString();

}else if (columnIndex == 4)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(p.getCreateDate());
}
}
return null;
}

public Image getColumnImage(Object element, int columnIndex)
{
return null;
}
}
注意這里:extends LabelProvider,為什么要加這個呢? 因為如果不加這個,因為實現 ITableLabelProvider 的緣故我們還要寫四個空函數,而我們本身不需要在這四個空函數中實現什么,所以讓它繼承自LabelProvider,就可以避免四個空函數。
(3)把標簽器和內容器給tableviewer
在shell.open()前邊加上這幾行
//設置內容器
tableViewer.setContentProvider(new ContentProvider());
//設置標簽器
tableViewer.setLabelProvider(new TableLabelProvider());
//把數據集合給tableView
tableViewer.setInput(People.getPeople());
//這樣利用內容器和標簽器就能從setInput得到的數據集合分解出顯示表格需要的數據。這是一個典型的mvc的實現.
4,樣式改變
如果想在每一列前加入一個checkbox
只需要在開始的式樣中加入SWT.CHECK
好了到此一個簡單的樣子選擇出來了,但這僅僅是開始,下邊將繼續介紹按列排序、過濾器、行的顏色設置、在表格上直接編輯等功能
附上source:http://www.tkk7.com/Files/dreamstone/jface-1.rar