项目现在基本出了一个版本,虽然做的是边缘工作,但是用到的东西还是整理一下吧,毕竟也算学了一点点东西。首先是TableView的使用。RWT是 SWT的子集,因此,RWT中可能没有完全实现SWT的全部接口,也没有SWT那么完善。两者的架构不同,表现在显示形式,界面也不尽相同,但是基本的控 件的时候还是相同的。这里首先通过SWT来学习一些常用控件的使用。
首先说下SWT需要的库文件。包括: org.eclipse.swt_3.x.x.jar org.eclipse.jface_3.x.x.jar
org.eclipse.core.runtime_3.x.x.jar org.eclipse.ui.workbench_3.x.x.jar (org.eclipse.equinox.common_3.x.x.jar)另外这个包中也包含org.eclipse.core.runtime 感觉组织的有点混乱,这个包也要导入。另外版本的不同也可能出现要包导入错误,注意下版本。
下面的代码就是Tableview的创建,是从《eclipse入门到精通》引用的
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.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; public class TableViewer1 { public static void main(String[] args) { new TableViewer1().open(); } public void open() { final Display display = new Display(); final Shell shell = new Shell(); shell.setSize(500, 150); // ------------------------------------------ shell.setLayout(new FillLayout()); // 第一步:创建一个TableViewer对象。式样:MULTI可多选、H_SCROLL有水平滚动条、V_SCROLL有垂直滚动条、BORDER有边框、FULL_SELECTION整行选择 TableViewer tv = new TableViewer(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION); // 第二步:通过表格内含的Table对象设置布局方式 Table table = tv.getTable(); table.setHeaderVisible(true); // 显示表头 table.setLinesVisible(true); // 显示表格线 TableLayout layout = new TableLayout(); // 专用于表格的布局 table.setLayout(layout); // 第三步:用TableColumn类创建表格列 layout.addColumnData(new ColumnWeightData(13));// ID列宽13像素 new TableColumn(table, SWT.NONE).setText("ID号"); layout.addColumnData(new ColumnWeightData(40)); new TableColumn(table, SWT.NONE).setText("姓名"); layout.addColumnData(new ColumnWeightData(20)); new TableColumn(table, SWT.NONE).setText("性别"); layout.addColumnData(new ColumnWeightData(20)); new TableColumn(table, SWT.NONE).setText("年龄"); layout.addColumnData(new ColumnWeightData(60)); new TableColumn(table, SWT.NONE).setText("记录建立时间"); // 第四步:设置内容器和标签器 tv.setContentProvider(new TableViewerContentProvider()); tv.setLabelProvider(new TableViewerLabelProvider()); // 第五步:用TableViewer的setInput方法将数据输入到表格 Object data = PeopleFactory.getPeoples(); tv.setInput(data); // ------------------------------------------ shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }
下面分别是那2个提供类,这2个在类如果代码较少,服务与1个表时候可以写成内部类:
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.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; public class TableViewer1 { public static void main(String[] args) { new TableViewer1().open(); } public void open() { final Display display = new Display(); final Shell shell = new Shell(); shell.setSize(500, 150); // ------------------------------------------ shell.setLayout(new FillLayout()); // 第一步:创建一个TableViewer对象。式样:MULTI可多选、H_SCROLL有水平滚动条、V_SCROLL有垂直滚动条、BORDER有边框、FULL_SELECTION整行选择 TableViewer tv = new TableViewer(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION); // 第二步:通过表格内含的Table对象设置布局方式 Table table = tv.getTable(); table.setHeaderVisible(true); // 显示表头 table.setLinesVisible(true); // 显示表格线 TableLayout layout = new TableLayout(); // 专用于表格的布局 table.setLayout(layout); // 第三步:用TableColumn类创建表格列 layout.addColumnData(new ColumnWeightData(13));// ID列宽13像素 new TableColumn(table, SWT.NONE).setText("ID号"); layout.addColumnData(new ColumnWeightData(40)); new TableColumn(table, SWT.NONE).setText("姓名"); layout.addColumnData(new ColumnWeightData(20)); new TableColumn(table, SWT.NONE).setText("性别"); layout.addColumnData(new ColumnWeightData(20)); new TableColumn(table, SWT.NONE).setText("年龄"); layout.addColumnData(new ColumnWeightData(60)); new TableColumn(table, SWT.NONE).setText("记录建立时间"); // 第四步:设置内容器和标签器 tv.setContentProvider(new TableViewerContentProvider()); tv.setLabelProvider(new TableViewerLabelProvider()); // 第五步:用TableViewer的setInput方法将数据输入到表格 Object data = PeopleFactory.getPeoples(); tv.setInput(data); // ------------------------------------------ shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }
import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.swt.graphics.Image; //标签器。如果说内容器是对输入表格的数据集作处理, //那么标签器则是对数据集中的单个实体对象进行处理和转化,由标签器来决定实体对象中的字段显示在表格的哪一列中。 public class TableViewerLabelProvider implements ITableLabelProvider { // 创建几个图像 private Image[] images = new Image[] { new Image(null, "icons/refresh.gif"), new Image(null, "icons/star.jpg"), new Image(null, "icons/moon.jpg") }; // 由此方法决定数据记录在表格的每一列显示什么文字。 // 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; // 方法可以返回空值 } 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) { } }
另外就是实体类,这里只是简单的写了一个实体,这里的数据可以从数据库中读取,但是那样注意数据的存储使用的容器类型,
并注意类型的转换。
import java.util.Date; //本类包含五个不同数据类型的变量,分别对应数据库表中的五个字段。变量为private型,即只能 //由类的内部代码访问,外界只能通过这些变量相应的Setter/Geter方法来访问它们 public class PeopleEntity { private Long id; //惟一识别码,在数据库里常为自动递增的ID列 private String name; //姓名 private boolean sex; //性别 true男,flase女 private int age; //年龄 private Date createDate; //记录的建立日期。Date类型是java.util.Date,而不是java.sql.Date //以下代码为字段各自的Setter/Geter方法。参考第3.5.2节,这些方法在Eclipse可自动生成。 public Long getId() { return id;} public void setId(Long long1) {id = long1;} public String getName() {return name;} public void setName(String string) {name = string;} public boolean isSex() { return sex;} public void setSex(boolean sex) { this.sex = sex; } public int getAge() {return age;} public void setAge(int i) {age = i;} public Date getCreateDate() {return createDate;} public void setCreateDate(Date date) {createDate = date;} }
另外是封装的获取数据的接口:
import java.util.ArrayList; import java.util.Date; import java.util.List; //创建PeopleEntity对象的工厂,创建三个PeopleEntry对象,并装入List集合返回 public class PeopleFactory { public static List<PeopleEntity> getPeoples() { // 工厂的静态方法 List<PeopleEntity> list = new ArrayList<PeopleEntity>(); { // 第1个实体类对象 PeopleEntity o = new PeopleEntity(); o.setId(new Long(1));// id字段的类型被定义成了Long,所以要转化一下 o.setName("陈刚"); o.setSex(true); o.setAge(28); o.setCreateDate(new Date()); // 当前日期 list.add(o); } { // 第2个实体类对象 PeopleEntity o = new PeopleEntity(); o.setId(2L); // 利用JDK5.0的自动装箱功能,省了long到Long对象的转化 o.setName("周阅"); o.setSex(false); o.setAge(18); o.setCreateDate(new Date()); list.add(o); } { // 第3个实体类对象 PeopleEntity o = new PeopleEntity(); o.setId(3L); o.setName("陈常恩"); o.setSex(true); o.setAge(27); o.setCreateDate(new Date()); list.add(o); } return list; } }
这样就实现了tableview的数据的读取,当然还可以实现一写其他的功能,和细节的改变。