前文回顾:

插件学习篇

简单的建立插件工程以及模型文件分析

利用扩展点,开发透视图

SWT编程须知

SWT简单控件的使用与布局搭配

SWT复杂空间与布局搭配

SWT布局详解

IPreferenceStore使用详解

9 编辑器代码着色

  前几篇讲过SWT的使用,但是SWT是基本的小控件,只能针对使用简单的数据类型,比如字符串,数字等等。但是遇到了复杂的类,该怎么办呢?

【插件开发】—— 10 JFace开发详解

  不要担心!这里就可以使用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,因为视图上现实的数据,都要从这个方法获得。

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

  1 package testpreference.views;
  2 
  3 import org.eclipse.jface.viewers.DoubleClickEvent;
  4 import org.eclipse.jface.viewers.IDoubleClickListener;
  5 import org.eclipse.jface.viewers.ISelectionChangedListener;
  6 import org.eclipse.jface.viewers.IStructuredContentProvider;
  7 import org.eclipse.jface.viewers.IStructuredSelection;
  8 import org.eclipse.jface.viewers.LabelProvider;
  9 import org.eclipse.jface.viewers.ListViewer;
 10 import org.eclipse.jface.viewers.SelectionChangedEvent;
 11 import org.eclipse.jface.viewers.Viewer;
 12 import org.eclipse.jface.viewers.ViewerSorter;
 13 import org.eclipse.swt.SWT;
 14 import org.eclipse.swt.graphics.Image;
 15 import org.eclipse.swt.widgets.Composite;
 16 import org.eclipse.ui.part.ViewPart;
 17 class Person{
 18     private int id;
 19     private String name;
 20     private int age;
 21     private String address;
 22     public int getId() {
 23         return id;
 24     }
 25     public void setId(int id) {
 26         this.id = id;
 27     }
 28     public String getName() {
 29         return name;
 30     }
 31     public void setName(String name) {
 32         this.name = name;
 33     }
 34     public int getAge() {
 35         return age;
 36     }
 37     public void setAge(int age) {
 38         this.age = age;
 39     }
 40     public String getAddress() {
 41         return address;
 42     }
 43     public void setAddress(String address) {
 44         this.address = address;
 45     }
 46     public String toString() {
 47         return name;
 48     }
 49 }
 50 
 51 
 52 public class ListViewerTest extends ViewPart {
 53     public static final String ID = "testpreference.views.ListViewerTest";
 54     private ListViewer viewer;
 55     
 56     public ListViewerTest() {
 57         
 58     }
 59 
 60     public void createPartControl(Composite parent) {
 61         viewer = new ListViewer(parent, SWT.SINGLE);
 62         viewer.setContentProvider(new ViewContentProvider());
 63         viewer.setLabelProvider(new ViewLabelProvider());
 64         viewer.setSorter(new MySorter());
 65         viewer.setInput(getSite());
 66 
 67         viewer.addSelectionChangedListener( new ISelectionChangedListener() {
 68             public void selectionChanged(SelectionChangedEvent event) {
 69                 IStructuredSelection selection = (IStructuredSelection)event.getSelection();
 70                 System.out.println("Now selecting "+selection.getFirstElement().toString());
 71             }
 72         });
 73         
 74         viewer.addDoubleClickListener( new IDoubleClickListener() {
 75             public void doubleClick(DoubleClickEvent event) {
 76                 IStructuredSelection selection = (IStructuredSelection)event.getSelection();
 77                 System.out.println("Double clicking "+selection.getFirstElement().toString());
 78             }
 79         });
 80     }
 81 
 82     public void setFocus() {
 83 
 84     }
 85     class ViewContentProvider implements IStructuredContentProvider{
 86         public Object[] getElements(Object inputElement) {
 87             
 88             Person[] persons = new Person[3];
 89             persons[0] = new Person();
 90             persons[0].setId(001);
 91             persons[0].setName("xingoo");
 92             persons[0].setAge(25);
 93             persons[0].setAddress("ChangChun");
 94             
 95             persons[1] = new Person();
 96             persons[1].setId(002);
 97             persons[1].setName("halo");
 98             persons[1].setAge(27);
 99             persons[1].setAddress("ShenYang");
100             
101             persons[2] = new Person();
102             persons[2].setId(003);
103             persons[2].setName("haha");
104             persons[2].setAge(25);
105             persons[2].setAddress("DaLian");
106             
107             return persons;
108         }
109         public void dispose() {
110         }
111         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
112         }
113     }
114     class ViewLabelProvider extends LabelProvider{
115         public Image getColumnImage(Object element) {
116             return null;
117         }
118         public String getColumnText(Object element) {
119             return getText(element);
120         }
121     }
122     class MySorter extends ViewerSorter{
123         public int compare(Viewer viewer,Object ob1,Object ob2){
124             return ((Person)ob1).getId() - ((Person)ob2).getId();
125         }
126     }
127 }
View Code

相关文章: