下面我们创建一个最基本的视图,表格视图,然后显示用户信息。
我们需要做这样几件事情:
1、在View.java中定义TabelViewer,为该表格视图创建标题,表格的列,同时还需要为它提供ContentProvider和LabelProvider
2、就是创建上面的ContentProvider和LabelProvider,这两个class的作用就是为表格视图提供数据的,其中LabelProvider就是将数据对应到表格的列上。
3、创建模型,为我们的表格视图提供数据。这里的模型就是一些POJO。
下面看看具体代码:
private UserLabelProvider labelProvider ;
private TableViewer viewer ;
public TableViewer getViewer() {
return viewer;
}
@Override
public void createPartControl(Composite parent) {
GridLayout layout = new GridLayout(1, false);
parent.setLayout(layout);
createViewer(parent);
List userList = ModelProvider.getInstance().getUsers() ;
viewer.setInput(userList);
getSite().setSelectionProvider(viewer);
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
viewer.getControl().setLayoutData(gridData);
}
private void createViewer(Composite parent){
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
createColumns(viewer);
viewer.setContentProvider(new UserContentProvider());
labelProvider = new UserLabelProvider();
viewer.setLabelProvider(labelProvider);
}
private void createColumns(final TableViewer viewer){
Table table = viewer.getTable();
String[] titles = { "ID","类型", "姓名", "性别","联系方式"};
int[] bounds = { 50, 100, 100, 50 , 100 } ;
for (int i = 0; i < titles.length; i++) {
final int index = i;
final TableViewerColumn viewerColumn = new TableViewerColumn(
viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(titles[i]);
column.setWidth(bounds[i]);
column.setResizable(true);
column.setMoveable(true);
viewer.refresh();
}
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
这里给出了View.java中的关键属性和方法。
private TableViewer viewer;就是定义表格查看器,createPartControl这个方法是ViewPart中定义的,
我们需要覆盖该方法,以便定义我们自己的视图,在该方法中,我们实例化viewer,并设定布局。
createViewer是具体的实例化viewer的方法,在该方法中还设定了viewer的内容提供者和标签提供者。
createColumns方法是创建表格的列,同时包括定义表格的标题部分。
注意:我们需要注意在createPartControl中有这样一行代码:viewer.setInput(userList);
该代码的作用就是设定表格的数据源。
另外,我们看看UserContentProvider和UserLabelProvider代码:
public class UserContentProvider implements IStructuredContentProvider {
@Override
public Object[] getElements(Object inputElement) {
List list = (List) inputElement;
System.out.println(list.size());
return list.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
这个class看起来比较简单,它的作用就是将输入转变成一个数组。
public class UserLabelProvider extends LabelProvider implements
ITableLabelProvider {
private Color systemColor;
public UserLabelProvider() {
systemColor = Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW);
}
public String getColumnText(Object element, int columnIndex) {
System.out.println("执行了方法:");
TdUser user = (TdUser) element;
switch (columnIndex) {
case 0:return user.getSrid().toString() ;
case 1:return user.getUtype();
case 2:return user.getName();
case 3:return user.getSex();
case 4:return user.getPhone();
default:throw new RuntimeException("Should not happen");
}
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
这个class的作用将模型的数据对应到表格的相应的列上。
至此,一个包含表格查看器的视图创建好了,我们可以看看效果了:
另外,我们还在ApplicationWorkbenchWindowAdvisor中覆盖了一个方法postWindowCreate
@Override
public void postWindowCreate() {
super.postWindowCreate();
Shell shell = getWindowConfigurer().getWindow().getShell();
Rectangle screenSize = Display.getDefault().getClientArea();
Rectangle frameSize = shell.getBounds();
shell.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
}
它的作用就是将我们的程序窗口在屏幕上居中显示。