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