zoukankan      html  css  js  c++  java
  • 【插件开发】—— 10 JFace开发详解

    前文回顾:

    插件学习篇

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

    利用扩展点,开发透视图

    SWT编程须知

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

    SWT复杂空间与布局搭配

    SWT布局详解

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

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

      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

      

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

      全部代码及运行结果

      1 package testpreference.views;
      2 
      3 import org.eclipse.jface.viewers.IStructuredContentProvider;
      4 import org.eclipse.jface.viewers.ITableLabelProvider;
      5 import org.eclipse.jface.viewers.LabelProvider;
      6 import org.eclipse.jface.viewers.TableViewer;
      7 import org.eclipse.jface.viewers.Viewer;
      8 import org.eclipse.jface.viewers.ViewerSorter;
      9 import org.eclipse.swt.SWT;
     10 import org.eclipse.swt.graphics.Image;
     11 import org.eclipse.swt.widgets.Composite;
     12 import org.eclipse.swt.widgets.Table;
     13 import org.eclipse.swt.widgets.TableColumn;
     14 import org.eclipse.ui.part.ViewPart;
     15 
     16 public class TableViewerTest extends ViewPart {
     17     public static final String ID = "testpreference.views.TableViewerTest";
     18     private TableViewer viewer;
     19     public TableViewerTest() {
     20         // TODO Auto-generated constructor stub
     21     }
     22 
     23     public void createPartControl(Composite parent) {
     24         viewer = new TableViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);
     25         Table table = viewer.getTable();
     26         table.setHeaderVisible(true);
     27         table.setLinesVisible(true);
     28         
     29         String[] columnNames = new String[]{"id","name","age","address"};
     30         int[] columnWidths = new int[]{100,100,100,100};
     31         int[] columnAlignments = new int[]{SWT.LEFT,SWT.LEFT,SWT.LEFT,SWT.LEFT};
     32         for(int i=0;i<columnNames.length;i++){
     33             TableColumn tableColumn  = new TableColumn(table,columnAlignments[i]);
     34             tableColumn.setText(columnNames[i]);
     35             tableColumn.setWidth(columnWidths[i]);
     36         }
     37         
     38         viewer.setContentProvider(new ViewContentProvider());
     39         viewer.setLabelProvider(new ViewLabelProvider());
     40         viewer.setSorter(new MySorter());
     41         viewer.setInput(getSite());
     42     }
     43 
     44     public void setFocus() {
     45         // TODO Auto-generated method stub
     46 
     47     }
     48     class ViewContentProvider implements IStructuredContentProvider {
     49         public Object[] getElements(Object inputElement) {
     50             
     51             Person[] persons = new Person[3];
     52             persons[0] = new Person();
     53             persons[0].setId(001);
     54             persons[0].setName("xingoo");
     55             persons[0].setAge(25);
     56             persons[0].setAddress("ChangChun");
     57             
     58             persons[1] = new Person();
     59             persons[1].setId(002);
     60             persons[1].setName("halo");
     61             persons[1].setAge(27);
     62             persons[1].setAddress("ShenYang");
     63             
     64             persons[2] = new Person();
     65             persons[2].setId(003);
     66             persons[2].setName("haha");
     67             persons[2].setAge(25);
     68             persons[2].setAddress("DaLian");
     69             
     70             return persons;
     71         }
     72         public void dispose() {
     73         }
     74         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
     75         }
     76     }
     77     class ViewLabelProvider extends LabelProvider implements ITableLabelProvider{
     78         public Image getColumnImage(Object element,int index) {
     79             return null;
     80         }
     81         public String getColumnText(Object element,int index) {
     82             Person person = (Person)element;
     83             switch(index){
     84             case 0:
     85                 return person.getId()+"";
     86             case 1:
     87                 return person.getName();
     88             case 2:
     89                 return person.getAge()+"";
     90             case 3:
     91                 return person.getAddress();
     92             default:
     93                 return "unknown"+index;
     94             }
     95         }
     96     }
     97     class MySorter extends ViewerSorter{
     98         public int compare(Viewer viewer,Object ob1,Object ob2){
     99             return ((Person)ob1).getId() - ((Person)ob2).getId();
    100         }
    101     }
    102 
    103 }
    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();
            }
        }

      全部代码以及运行结果

      1 package testpreference.views;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import org.eclipse.jface.viewers.ArrayContentProvider;
      7 import org.eclipse.jface.viewers.ITreeContentProvider;
      8 import org.eclipse.jface.viewers.LabelProvider;
      9 import org.eclipse.jface.viewers.TreeViewer;
     10 import org.eclipse.jface.viewers.Viewer;
     11 import org.eclipse.jface.viewers.ViewerSorter;
     12 import org.eclipse.swt.SWT;
     13 import org.eclipse.swt.graphics.Image;
     14 import org.eclipse.swt.widgets.Composite;
     15 import org.eclipse.ui.part.ViewPart;
     16 class TreePerson{
     17     private int id;
     18     private String name;
     19     private int age;
     20     private String address;
     21     private List<TreePerson> children;
     22     private TreePerson parent = null; 
     23     
     24     public TreePerson() {
     25         children = new ArrayList();
     26     }
     27     public List<TreePerson> getChildren() {
     28         return children;
     29     }
     30     public void setChildren(List<TreePerson> children) {
     31         this.children = children;
     32     }
     33     public TreePerson getParent() {
     34         return parent;
     35     }
     36     public void setParent(TreePerson parent) {
     37         this.parent = parent;
     38     }
     39     public int getId() {
     40         return id;
     41     }
     42     public void setId(int id) {
     43         this.id = id;
     44     }
     45     public String getName() {
     46         return name;
     47     }
     48     public void setName(String name) {
     49         this.name = name;
     50     }
     51     public int getAge() {
     52         return age;
     53     }
     54     public void setAge(int age) {
     55         this.age = age;
     56     }
     57     public String getAddress() {
     58         return address;
     59     }
     60     public void setAddress(String address) {
     61         this.address = address;
     62     }
     63     public String toString() {
     64         return name;
     65     }
     66 }
     67 public class TreeViewerTest extends ViewPart {
     68     public static final String ID = "testpreference.views.TreeViewerTest";
     69     private TreeViewer viewer;
     70     public TreeViewerTest() {
     71         // TODO Auto-generated constructor stub
     72     }
     73 
     74     public void createPartControl(Composite parent) {
     75         viewer = new TreeViewer(parent,SWT.SINGLE);
     76         viewer.setLabelProvider(new ViewLabelProvider());
     77         viewer.setContentProvider(new ViewContentProvider());
     78         viewer.setSorter(new MySorter());
     79         viewer.setInput(getSite());
     80     }
     81 
     82     public void setFocus() {
     83         // TODO Auto-generated method stub
     84 
     85     }
     86     class ViewContentProvider extends ArrayContentProvider implements ITreeContentProvider{
     87 
     88         public Object[] getChildren(Object parentElement) {
     89             TreePerson person = (TreePerson)parentElement;
     90             return person.getChildren().toArray();
     91         }
     92 
     93         public Object getParent(Object element) {
     94             TreePerson person = (TreePerson)element;
     95             return person.getParent();
     96         }
     97 
     98         public boolean hasChildren(Object element) {
     99             TreePerson person = (TreePerson)element;
    100             return person.getChildren().size()>0?true:false;
    101         }
    102         
    103         public Object[] getElements(Object inputElement) {
    104             TreePerson[] persons = new TreePerson[3];
    105             persons[0] = new TreePerson();
    106             persons[0].setId(001);
    107             persons[0].setName("xingoo");
    108             persons[0].setAge(25);
    109             persons[0].setAddress("ChangChun");
    110             
    111             persons[1] = new TreePerson();
    112             persons[1].setId(002);
    113             persons[1].setName("halo");
    114             persons[1].setAge(27);
    115             persons[1].setAddress("ShenYang");
    116             
    117             persons[2] = new TreePerson();
    118             persons[2].setId(003);
    119             persons[2].setName("haha");
    120             persons[2].setAge(25);
    121             persons[2].setAddress("DaLian");
    122             
    123             persons[0].getChildren().add(persons[1]);
    124             persons[0].getChildren().add(persons[2]);
    125             persons[1].setParent(persons[0]);
    126             persons[2].setParent(persons[0]);
    127             
    128             return persons;
    129         }
    130         
    131     }
    132     class ViewLabelProvider extends LabelProvider{
    133         public Image getColumnImage(Object element) {
    134             return null;
    135         }
    136         public String getColumnText(Object element) {
    137             return ((TreePerson)element).toString();
    138         }
    139     }
    140     class MySorter extends ViewerSorter{
    141         public int compare(Viewer viewer,Object ob1,Object ob2){
    142             return ((TreePerson)ob1).getId() - ((TreePerson)ob2).getId();
    143         }
    144     }
    145 }
    View Code

      TextViewer

      这个前一篇的源码编辑器上有讲解过,是一种可以编辑的Text文本,它可以设定特定复杂的样式,这里就看一个简单的例子

     1 viewer = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL);
     2         String str = "this is test 
     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());

      全部代码以及运行结果

     1 package testpreference.views;
     2 
     3 import org.eclipse.jface.text.Document;
     4 import org.eclipse.jface.text.TextPresentation;
     5 import org.eclipse.jface.text.TextViewer;
     6 import org.eclipse.jface.viewers.TreeViewer;
     7 import org.eclipse.swt.SWT;
     8 import org.eclipse.swt.custom.StyleRange;
     9 import org.eclipse.swt.graphics.Color;
    10 import org.eclipse.swt.widgets.Composite;
    11 import org.eclipse.ui.part.ViewPart;
    12 
    13 import testpreference.views.TreeViewerTest.MySorter;
    14 import testpreference.views.TreeViewerTest.ViewContentProvider;
    15 import testpreference.views.TreeViewerTest.ViewLabelProvider;
    16 
    17 public class TextViewerTest extends ViewPart {
    18     public static final String ID = "testpreference.views.TreeViewerTest";
    19     private TextViewer viewer;
    20     
    21     public TextViewerTest() {
    22         // TODO Auto-generated constructor stub
    23     }
    24 
    25     public void createPartControl(Composite parent) {
    26         viewer = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL);
    27         String str = "this is test 
     this is test";
    28         Document document = new Document(str);
    29         viewer.setDocument(document);
    30         
    31         TextPresentation style = new TextPresentation();
    32         style.addStyleRange(new StyleRange(0,12,null,null,SWT.BOLD));
    33         viewer.changeTextPresentation(style, true);
    34         
    35         viewer.setInput(getSite());
    36     }
    37 
    38     public void setFocus() {
    39         // TODO Auto-generated method stub
    40 
    41     }
    42 
    43 }
    View Code

  • 相关阅读:
    在 Eclipse Workbench 之外使用 Eclipse GUI
    GB2312,GBK,Unicode
    木偶一之推荐系统
    Matlab:任意矩阵计算分布密度(海明距离的分布密度)
    live555在arm linux下的交叉编译,并下载的Arm板播放H264文件
    java设计模式之原型模式
    HDU 1102
    poj3661另一种做法(滚动数组)
    基于QT的小游戏细菌病毒战
    某代码查看器的保护突破
  • 原文地址:https://www.cnblogs.com/xing901022/p/4104409.html
Copyright © 2011-2022 走看看