最近在开发关于eclipse插件的相关,中途遇到很多坑,下面这个例子是目前我找到的比较简洁的关于tableViewer的例子,记录下来,分享给广大网友,本来想说明出处,但是由于网上的很多原创其实并非原创,我也就实行“拿来主义”分享给大家了。
一、创建表格分为三个步骤,大概讲一下。(后面有完成的代码,可以直接复制黏贴使用)
1、第一步:定义一个TableViewer对象.
//首先定义一个表格(TableViewer类)对象
private TableViewer tableviewer;
/*
* 同时在构造方法中定义其式样. 这里设置成可以多选(SWT.MULTI),
* 有水平滚动条(SWT.H_SCROLL),有垂直滚动条(SWT.V_SCROLL),
* 有边框(SWT.BORDER),可以整行选择(SWT.FULL_SELECTION)
*/
tableviewer = new TableViewer(prarent, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.FULL_SELECTION );
2、第二步:通过TableViewer中的Table对其布局.
Table table = tableviewer.getTable();
//设置表头
table.setHeaderVisible(true);
//显示表格线
table.setLinesVisible(true);
//专用于表格的布局
TableLayout tLayout = new TableLayout();
table.setLayout(tLayout);
3、第三步:建立TableViewer中的列
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("ID号");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为40像素
new TableColumn(table, SWT.NONE).setText("姓名");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("性别");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("年龄");
tLayout.addColumnData(new ColumnWeightData(70));//这个是设置ID列的列宽为70像素
new TableColumn(table, SWT.NONE).setText("记录建立时间");
二、上面就是一个表格的主体内容和实现的步骤了,下面开始贴代码:
1、TableViewer 表格主体类
//TableViewer 表格主体类
package testTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
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;
/**
* TableViewer类的实现类
* @author John
*/
public class TableViewer {
//首先定义一个表格(TableViewer类)对象
private TableViewer tableviewer;
public static void main(String[] args) {
TableViewer window = new TableViewer();
window.open();
}
//定义这个open()方法.就是创建一个典型的SWT程序的步骤
public void open(){
//1.display负责管理一实现循环和控制UI线程和其他线程之间的通信
Display display = new Display();
//2.创建一个或者多个Shell(shell是程序的主窗口)
Shell shell = new Shell();
//3.设置shell的布局.
shell.setSize(500, 150);
//设置shell的布局为FillLayout
shell.setLayout(new FillLayout());
shell.setText("TableViewer的第一个例子");
//调用自定义的方法创建表格
createTableViewer(shell);
//4.设定内容器
tableviewer.setContentProvider(new TableViewerContentProvider());
//5.设定标签器
tableviewer.setLabelProvider(new TableViewerLabelProvider());
//6.用setInput输入数据(把PeopleFactory产生的List集合传进来)
tableviewer.setInput(PeopleFactory.getPeoples());
//7.创建Shell中的组件(这个例子中没有加入组件,只有一个空窗口)
shell.open();
//8.写一个时间转发循环
while(!shell.isDisposed()){//如果主窗口没有关闭,则一直循环
//dispose 是"处理,处置,毁掉"的意思
if(!display.readAndDispatch()){ 如果display不忙
display.sleep();// display休眠
}
}
}
/**
* 创建一个表格
*/
public void createTableViewer(Composite prarent){
/**
* 第一步:定义一个TableViewer对象.
* 同时在构造方法中定义其式样. 这里设置成可以多选(SWT.MULTI),
* 有水平滚动条(SWT.H_SCROLL),有垂直滚动条(SWT.V_SCROLL),
* 有边框(SWT.BORDER),可以整行选择(SWT.FULL_SELECTION)
*/
tableviewer = new TableViewer(prarent, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.FULL_SELECTION );
/**
* 第二步:通过TableViewer中的Table对其布局.
*/
Table table = tableviewer.getTable();
table.setHeaderVisible(true);//设置标头
table.setLinesVisible(true);//显示表格线
TableLayout tLayout = new TableLayout();//专用于表格的布局
table.setLayout(tLayout);
/**
* 第三步:建立TableViewer中的列
*/
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("ID号");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为40像素
new TableColumn(table, SWT.NONE).setText("姓名");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("性别");
tLayout.addColumnData(new ColumnWeightData(20));//这个是设置ID列的列宽为10像素
new TableColumn(table, SWT.NONE).setText("年龄");
tLayout.addColumnData(new ColumnWeightData(70));//这个是设置ID列的列宽为70像素
new TableColumn(table, SWT.NONE).setText("记录建立时间");
}
}
2、tableViewer的标签器TableViewerLabelProvider
package testTableViewer;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
//-------------文件名:TableViewerLabelProvider.java-------------------
//标签器。如果说内容器是对输入表格的数据集作处理,那么标签器则是对数据集中的单个实体对象
//进行处理和转化,由标签器来决定实体对象中的字段显示在表格的哪一列中
public class TableViewerLabelProvider implements ITableLabelProvider {
// 创建几个图像
private Image[] images = new Image[] { new Image(null, "icons/1.PNG"), new Image(null, "icons/1.PNG"),
new Image(null, "icons/1.PNG") };
// 由此方法决定数据记录在表格的每一列显示什么文字。 element参数是一个实体类对象
// col是当前要设置的列的列号,0是第一列
public String getColumnText(Object element, int col) {
PeopleEntity o = (PeopleEntity) element; // 类型转换
if (col == 0)// 第一列要显示什么数据
return o.getId().toString();
if (col == 1)
return o.getName();
if (col == 2)
return o.isSex() ? "男" : "女";
if (col == 3)
return String.valueOf(o.getAge()); // 将int型转为String型
if (col == 4)
return o.getCreateDate().toString();
return null; // 方法可以返回空值
}
// getColumnText方法用于显示文字,本方法用于显示图片
public Image getColumnImage(Object element, int col) {
PeopleEntity o = (PeopleEntity) element;
// 只让“陈刚”这条记录显示图片
if (o.getName().equals("陈刚") || o.getName().equals("周阅")) {
if (col == 0)// 第一列要显示的图片
return images[0];
if (col == 2)// 根据性别显示不同的图标
return o.isSex() ? images[1] : images[2];
}
return null; // 方法可以返回空值
}
// 当TableViewer对象被关闭时触发执行此方法
public void dispose() {
// 别忘了SWT组件的原则:自己创建,自释放
for (Image image : images) {
image.dispose();
}
}
// -------------以下方法很少使用,先不用管,让它们空实现-----------------
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void addListener(ILabelProviderListener listener) {
}
public void removeListener(ILabelProviderListener listener) {
}
}
3、tableViewer的内容器TableViewerContentProvider
package testTableViewer;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* 创建这个类,主要是对List集合中的数据记录进行筛选和转化. 是"内容器"的作用.
* 内容器中主要是对setInput()输入的数据集集合(本例子中指的是在PeopleFactory中封装好的List集合)做处理.
* 并且转换化成一个数组返回.
*
* 实现对应的接口IStructuredContentProvider,然后实现其中的方法.
*
* @author John
*/
public class TableViewerContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
// 实现IStructuredContentProvider接口之后,主要复写的就是这个getElements()方法.
@Override
public Object[] getElements(Object inputElement) {// setInput传过来的是一个集合
if (inputElement instanceof List) {// 对这个参数进行类型的判断.
return ((List) inputElement).toArray();// 将setInput传过来的List变成一个数组输出
} else {
return new Object[0];
}
}
}
至此,完毕。main方法运行第一个主类可以看到如下效果,图标可以自己切换,也可以为空:
希望这篇教程能够对你有所帮助。