您的位置:首页 > 其它

JFace开发详解

2015-10-28 17:31 288 查看
原文:http://www.cnblogs.com/xing901022/p/4104409.html#_label2

阅读目录

  ListViewer

  tableViewer

  TreeViewer

  TextViewer

前文回顾:
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,因为视图上现实的数据,都要从这个方法获得。

  下面看一下对应的全部代码


View
Code

  


回到顶部


  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;
}
}
}


  全部代码及运行结果


View
Code



回到顶部


  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();
}
}


  全部代码以及运行结果


View
Code



回到顶部


  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());


  全部代码以及运行结果


View
Code

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: