【插件開發】—— 10 JFace開發詳解

前文回顧:html

插件學習篇java

簡單的創建插件工程以及模型文件分析編程

利用擴展點,開發透視圖eclipse

SWT編程須知編輯器

SWT簡單控件的使用與佈局搭配ide

SWT複雜空間與佈局搭配函數

SWT佈局詳解佈局

IPreferenceStore使用詳解學習

9 編輯器代碼着色ui

  前幾篇講過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 \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());

  所有代碼以及運行結果

 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 \n 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

相關文章
相關標籤/搜索