JFace开发详解
来源:互联网 发布:foxtable建立数据库 编辑:程序博客网 时间:2024/06/05 09:39
原文:http://www.cnblogs.com/xing901022/p/4104409.html#_label2
前文回顾:
1 插件学习篇
2 简单的建立插件工程以及模型文件分析
3 利用扩展点,开发透视图
4 SWT编程须知
5 SWT简单控件的使用与布局搭配
6 SWT复杂空间与布局搭配
7 SWT布局详解
8 IPreferenceStore使用详解
9 编辑器代码着色
前几篇讲过SWT的使用,但是SWT是基本的小控件,只能针对使用简单的数据类型,比如字符串,数字等等。但是遇到了复杂的类,该怎么办呢?
不要担心!这里就可以使用JFace了,它是对SWT的封装,可以应用于复杂的数据类型。
下面的介绍中有时候说控件,有时候说视图,原因就是这个JFace通常用于某个视图中,但是它其实就是一个复杂的组合控件而已,只不过需要我们额外的去设定内容与复杂类的内容匹配。因此如果想使用复杂的数据类型,必然要与JFace提供的控件进行兼容,就涉及到两个主要的函数:setContentProvider() 以及 setLabelProvider()。这两个函数下面会进行详细的介绍:
setContentProvider() 内容提供者
这个函数为JFace的控件提供内容,总的来说一共有一下几种:
ListViewer列表视图 TabelViewer表格视图 TreeViewer树形视图 TextViewer文本视图
除了最后一种比较特殊,不需压指定内容提供者,其他的三个JFace视图都需要设置内容提供者,以便设定关联的内容。
setLabelProvider()标签提供者
这个函数设置了标签提供者,用于JFace的控件视图现实内容,一般来说都有两个函数:
getColumnImage()和getColumnText(),一个用于设定标签上现实的图片,一个用于设定现实的内容
那么下面就看一下不同的JFace视图,这两个函数使用的差异。
ListViewer
这个列表视图,属于最简单的视图了,这里我们创建一个复杂点的元素
1 class Person{ 2 private int id; 3 private String name; 4 private int age; 5 private String address; 6 public int getId() { 7 return id; 8 } 9 public void setId(int id) {10 this.id = id;11 }12 public String getName() {13 return name;14 }15 public void setName(String name) {16 this.name = name;17 }18 public int getAge() {19 return age;20 }21 public void setAge(int age) {22 this.age = age;23 }24 public String getAddress() {25 return address;26 }27 public void setAddress(String address) {28 this.address = address;29 }30 public String toString() {31 return name;32 }33 }
当我们从扩展点创建一个视图,并打开它的实现类时,插件为我们自动添加好了接口,里面有三个直接生成的函数
public class ListViewerTest extends ViewPart { public ListViewerTest() { } public void createPartControl(Composite parent) { } public void setFocus() { }}
此时,我们需要扩展createPartControl,在这里面创建一个view,并在其中添加 内容提供者函数,以及标签提供者函数。
viewer = new ListViewer(parent, SWT.SINGLE);viewer.setContentProvider(new ViewContentProvider());viewer.setLabelProvider(new ViewLabelProvider());viewer.setSorter(new MySorter());viewer.setInput(getSite());
通常来说,都会有上面的五句话
第一行:创建了一个ListViewer的视图
第二行:设置它的内容提供者
第三行:设置它的标签提供者
第四行:设置排序规则
第五行:设置输入,这里面我们的输入由内容提供者提供,因此这里就直接设置参数为getSite()(可以理解为一个字符串,这个地方随便写都行,但是一定要有这个函数,空串都可以)就可以了。
下面看一下这几个函数的实现:
class ViewContentProvider implements IStructuredContentProvider{ public Object[] getElements(Object inputElement) { Person[] persons = new Person[3]; persons[0] = new Person(); persons[0].setId(001); persons[0].setName("xingoo"); persons[0].setAge(25); persons[0].setAddress("ChangChun"); persons[1] = new Person(); persons[1].setId(002); persons[1].setName("halo"); persons[1].setAge(27); persons[1].setAddress("ShenYang"); persons[2] = new Person(); persons[2].setId(003); persons[2].setName("haha"); persons[2].setAge(25); persons[2].setAddress("DaLian"); return persons; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } class ViewLabelProvider extends LabelProvider{ public Image getColumnImage(Object element) { return null; } public String getColumnText(Object element) { return getText(element); } } class MySorter extends ViewerSorter{ public int compare(Viewer viewer,Object ob1,Object ob2){ return ((Person)ob1).getId() - ((Person)ob2).getId(); } }
对于内容提供者来说,最重要的一个方法就是getElements,因为视图上现实的数据,都要从这个方法获得。
下面看一下对应的全部代码
tableViewer
这个对于上面的Listviewer来说,标签提供者方面复杂了一些
首先,创建视图时,需要定义Table的样式
1 viewer = new TableViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION); 2 Table table = viewer.getTable(); 3 table.setHeaderVisible(true); 4 table.setLinesVisible(true); 5 6 String[] columnNames = new String[]{"id","name","age","address"}; 7 int[] columnWidths = new int[]{100,100,100,100}; 8 int[] columnAlignments = new int[]{SWT.LEFT,SWT.LEFT,SWT.LEFT,SWT.LEFT}; 9 for(int i=0;i<columnNames.length;i++){10 TableColumn tableColumn = new TableColumn(table,columnAlignments[i]);11 tableColumn.setText(columnNames[i]);12 tableColumn.setWidth(columnWidths[i]);13 }14 15 viewer.setContentProvider(new ViewContentProvider());16 viewer.setLabelProvider(new ViewLabelProvider());17 viewer.setSorter(new MySorter());18 viewer.setInput(getSite());
对于标签提供者函数来说,稍微麻烦一点,需要根据index指定每一列显示的内容
class ViewLabelProvider extends LabelProvider implements ITableLabelProvider{ public Image getColumnImage(Object element,int index) { return null; } public String getColumnText(Object element,int index) { Person person = (Person)element; switch(index){ case 0: return person.getId()+""; case 1: return person.getName(); case 2: return person.getAge()+""; case 3: return person.getAddress(); default: return "unknown"+index; } } }
全部代码及运行结果
TreeViewer
这个视图相比前面的这个复杂在它的内容提供者函数,我们需要让他的ContentProvider函数继承ITreeContentProvider接口,需要实现下面几个方法:
getChildren();获取节点的孩子节点。
getParent();获取节点的父节点
hasChildren();判断是否有孩子节点
getElements();获取全部的节点
下面看一下示例的代码
1 class ViewContentProvider extends ArrayContentProvider implements ITreeContentProvider{ 2 3 public Object[] getChildren(Object parentElement) { 4 TreePerson person = (TreePerson)parentElement; 5 return person.getChildren().toArray(); 6 } 7 8 public Object getParent(Object element) { 9 TreePerson person = (TreePerson)element;10 return person.getParent();11 }12 13 public boolean hasChildren(Object element) {14 TreePerson person = (TreePerson)element;15 return person.getChildren().size()>0?true:false;16 }17 18 public Object[] getElements(Object inputElement) {19 TreePerson[] persons = new TreePerson[3];20 persons[0] = new TreePerson();21 persons[0].setId(001);22 persons[0].setName("xingoo");23 persons[0].setAge(25);24 persons[0].setAddress("ChangChun");25 26 persons[1] = new TreePerson();27 persons[1].setId(002);28 persons[1].setName("halo");29 persons[1].setAge(27);30 persons[1].setAddress("ShenYang");31 32 persons[2] = new TreePerson();33 persons[2].setId(003);34 persons[2].setName("haha");35 persons[2].setAge(25);36 persons[2].setAddress("DaLian");37 38 persons[0].getChildren().add(persons[1]);39 persons[0].getChildren().add(persons[2]);40 persons[1].setParent(persons[0]);41 persons[2].setParent(persons[0]);42 43 return persons;44 }45 46 }
而他的标签提供者跟ListViewer的差不多,仅仅需要提供一个简单的名称就可以了。
class ViewLabelProvider extends LabelProvider{ public Image getColumnImage(Object element) { return null; } public String getColumnText(Object element) { return ((TreePerson)element).toString(); } }
全部代码以及运行结果
TextViewer
这个前一篇的源码编辑器上有讲解过,是一种可以编辑的Text文本,它可以设定特定复杂的样式,这里就看一个简单的例子
1 viewer = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL); 2 String str = "this is test \n this is test"; 3 Document document = new Document(str); 4 viewer.setDocument(document); 5 6 TextPresentation style = new TextPresentation(); 7 style.addStyleRange(new StyleRange(0,12,null,null,SWT.BOLD)); 8 viewer.changeTextPresentation(style, true); 9 10 viewer.setInput(getSite());
全部代码以及运行结果
- JFace开发详解
- JFace 开发向导
- JFace开发环境搭建
- 准备 JFace 开发环境
- SWT/JFace开发入门指南
- SWT/JFace开发入门指南
- eclipse下SWT/JFace开发
- 正确配置JFace开发环境
- JFace的开发环境配置
- SWT/JFace开发入门指南
- SWT-JFace开发入门(一)
- SWT-JFace开发入门(二)
- SWT-JFace开发的利器
- JFace
- SWT/JFace开发入门指南(一)
- SWT/JFace开发入门指南(二)
- SWT/JFace开发入门指南(三)
- SWT/JFace开发入门指南(四)
- 手机屏幕坐标获取方法
- MSTest.exe 命令行选项
- PL/SQL开发环境准备
- Linux动态库的编译与使用
- android常识
- JFace开发详解
- Material Design - Activity transitions
- Plugin(插件)和Goals(目标)
- ATL 支持ActiveX控件开发的所实现的接口
- 当你还不能写出自己满意的程序时,你就不要去睡觉。
- (5)python循环语句
- hibernate jpa 注解 @Temporal(TemporalType.DATE)
- 进程与线程的区别(转)
- Laravel框架的体系结构