前文回顾:

插件学习篇

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

利用扩展点,开发透视图

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

  这个列表视图,属于最简单的视图了,这里我们创建一个复杂点的元素

 class Person{
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return name;
}
}

  当我们从扩展点创建一个视图,并打开它的实现类时,插件为我们自动添加好了接口,里面有三个直接生成的函数

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[];
persons[] = new Person();
persons[].setId();
persons[].setName("xingoo");
persons[].setAge();
persons[].setAddress("ChangChun"); persons[] = new Person();
persons[].setId();
persons[].setName("halo");
persons[].setAge();
persons[].setAddress("ShenYang"); persons[] = new Person();
persons[].setId();
persons[].setName("haha");
persons[].setAge();
persons[].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,因为视图上现实的数据,都要从这个方法获得。

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

 package testpreference.views;

 import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
class Person{
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return name;
}
} public class ListViewerTest extends ViewPart {
public static final String ID = "testpreference.views.ListViewerTest";
private ListViewer viewer; public ListViewerTest() { } public void createPartControl(Composite parent) {
viewer = new ListViewer(parent, SWT.SINGLE);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setSorter(new MySorter());
viewer.setInput(getSite()); viewer.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
System.out.println("Now selecting "+selection.getFirstElement().toString());
}
}); viewer.addDoubleClickListener( new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
System.out.println("Double clicking "+selection.getFirstElement().toString());
}
});
} public void setFocus() { }
class ViewContentProvider implements IStructuredContentProvider{
public Object[] getElements(Object inputElement) { Person[] persons = new Person[];
persons[] = new Person();
persons[].setId();
persons[].setName("xingoo");
persons[].setAge();
persons[].setAddress("ChangChun"); persons[] = new Person();
persons[].setId();
persons[].setName("halo");
persons[].setAge();
persons[].setAddress("ShenYang"); persons[] = new Person();
persons[].setId();
persons[].setName("haha");
persons[].setAge();
persons[].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();
}
}
}

  

  tableViewer

  这个对于上面的Listviewer来说,标签提供者方面复杂了一些

  首先,创建视图时,需要定义Table的样式

 viewer = new TableViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true); String[] columnNames = new String[]{"id","name","age","address"};
int[] columnWidths = new int[]{,,,};
int[] columnAlignments = new int[]{SWT.LEFT,SWT.LEFT,SWT.LEFT,SWT.LEFT};
for(int i=;i<columnNames.length;i++){
TableColumn tableColumn = new TableColumn(table,columnAlignments[i]);
tableColumn.setText(columnNames[i]);
tableColumn.setWidth(columnWidths[i]);
} viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setSorter(new MySorter());
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 :
return person.getId()+"";
case :
return person.getName();
case :
return person.getAge()+"";
case :
return person.getAddress();
default:
return "unknown"+index;
}
}
}

  全部代码及运行结果

 package testpreference.views;

 import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.part.ViewPart; public class TableViewerTest extends ViewPart {
public static final String ID = "testpreference.views.TableViewerTest";
private TableViewer viewer;
public TableViewerTest() {
// TODO Auto-generated constructor stub
} public void createPartControl(Composite parent) {
viewer = new TableViewer(parent,SWT.SINGLE|SWT.FULL_SELECTION);
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true); String[] columnNames = new String[]{"id","name","age","address"};
int[] columnWidths = new int[]{,,,};
int[] columnAlignments = new int[]{SWT.LEFT,SWT.LEFT,SWT.LEFT,SWT.LEFT};
for(int i=;i<columnNames.length;i++){
TableColumn tableColumn = new TableColumn(table,columnAlignments[i]);
tableColumn.setText(columnNames[i]);
tableColumn.setWidth(columnWidths[i]);
} viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setSorter(new MySorter());
viewer.setInput(getSite());
} public void setFocus() {
// TODO Auto-generated method stub }
class ViewContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) { Person[] persons = new Person[];
persons[] = new Person();
persons[].setId();
persons[].setName("xingoo");
persons[].setAge();
persons[].setAddress("ChangChun"); persons[] = new Person();
persons[].setId();
persons[].setName("halo");
persons[].setAge();
persons[].setAddress("ShenYang"); persons[] = new Person();
persons[].setId();
persons[].setName("haha");
persons[].setAge();
persons[].setAddress("DaLian"); return persons;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
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 :
return person.getId()+"";
case :
return person.getName();
case :
return person.getAge()+"";
case :
return person.getAddress();
default:
return "unknown"+index;
}
}
}
class MySorter extends ViewerSorter{
public int compare(Viewer viewer,Object ob1,Object ob2){
return ((Person)ob1).getId() - ((Person)ob2).getId();
}
} }

  TreeViewer

  这个视图相比前面的这个复杂在它的内容提供者函数,我们需要让他的ContentProvider函数继承ITreeContentProvider接口,需要实现下面几个方法:

  getChildren();获取节点的孩子节点。

  getParent();获取节点的父节点

  hasChildren();判断是否有孩子节点

  getElements();获取全部的节点

  下面看一下示例的代码

 class ViewContentProvider extends ArrayContentProvider implements ITreeContentProvider{

         public Object[] getChildren(Object parentElement) {
TreePerson person = (TreePerson)parentElement;
return person.getChildren().toArray();
} public Object getParent(Object element) {
TreePerson person = (TreePerson)element;
return person.getParent();
} public boolean hasChildren(Object element) {
TreePerson person = (TreePerson)element;
return person.getChildren().size()>?true:false;
} public Object[] getElements(Object inputElement) {
TreePerson[] persons = new TreePerson[];
persons[] = new TreePerson();
persons[].setId();
persons[].setName("xingoo");
persons[].setAge();
persons[].setAddress("ChangChun"); persons[] = new TreePerson();
persons[].setId();
persons[].setName("halo");
persons[].setAge();
persons[].setAddress("ShenYang"); persons[] = new TreePerson();
persons[].setId();
persons[].setName("haha");
persons[].setAge();
persons[].setAddress("DaLian"); persons[].getChildren().add(persons[]);
persons[].getChildren().add(persons[]);
persons[].setParent(persons[]);
persons[].setParent(persons[]); return persons;
} }

  而他的标签提供者跟ListViewer的差不多,仅仅需要提供一个简单的名称就可以了。

class ViewLabelProvider extends LabelProvider{
public Image getColumnImage(Object element) {
return null;
}
public String getColumnText(Object element) {
return ((TreePerson)element).toString();
}
}

  全部代码以及运行结果

 package testpreference.views;

 import java.util.ArrayList;
import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
class TreePerson{
private int id;
private String name;
private int age;
private String address;
private List<TreePerson> children;
private TreePerson parent = null; public TreePerson() {
children = new ArrayList();
}
public List<TreePerson> getChildren() {
return children;
}
public void setChildren(List<TreePerson> children) {
this.children = children;
}
public TreePerson getParent() {
return parent;
}
public void setParent(TreePerson parent) {
this.parent = parent;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return name;
}
}
public class TreeViewerTest extends ViewPart {
public static final String ID = "testpreference.views.TreeViewerTest";
private TreeViewer viewer;
public TreeViewerTest() {
// TODO Auto-generated constructor stub
} public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent,SWT.SINGLE);
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setContentProvider(new ViewContentProvider());
viewer.setSorter(new MySorter());
viewer.setInput(getSite());
} public void setFocus() {
// TODO Auto-generated method stub }
class ViewContentProvider extends ArrayContentProvider implements ITreeContentProvider{ public Object[] getChildren(Object parentElement) {
TreePerson person = (TreePerson)parentElement;
return person.getChildren().toArray();
} public Object getParent(Object element) {
TreePerson person = (TreePerson)element;
return person.getParent();
} public boolean hasChildren(Object element) {
TreePerson person = (TreePerson)element;
return person.getChildren().size()>?true:false;
} public Object[] getElements(Object inputElement) {
TreePerson[] persons = new TreePerson[];
persons[] = new TreePerson();
persons[].setId();
persons[].setName("xingoo");
persons[].setAge();
persons[].setAddress("ChangChun"); persons[] = new TreePerson();
persons[].setId();
persons[].setName("halo");
persons[].setAge();
persons[].setAddress("ShenYang"); persons[] = new TreePerson();
persons[].setId();
persons[].setName("haha");
persons[].setAge();
persons[].setAddress("DaLian"); persons[].getChildren().add(persons[]);
persons[].getChildren().add(persons[]);
persons[].setParent(persons[]);
persons[].setParent(persons[]); return persons;
} }
class ViewLabelProvider extends LabelProvider{
public Image getColumnImage(Object element) {
return null;
}
public String getColumnText(Object element) {
return ((TreePerson)element).toString();
}
}
class MySorter extends ViewerSorter{
public int compare(Viewer viewer,Object ob1,Object ob2){
return ((TreePerson)ob1).getId() - ((TreePerson)ob2).getId();
}
}
}

  TextViewer

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

 viewer = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL);
String str = "this is test \n this is test";
Document document = new Document(str);
viewer.setDocument(document); TextPresentation style = new TextPresentation();
style.addStyleRange(new StyleRange(,,null,null,SWT.BOLD));
viewer.changeTextPresentation(style, true); viewer.setInput(getSite());

  全部代码以及运行结果

 package testpreference.views;

 import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart; import testpreference.views.TreeViewerTest.MySorter;
import testpreference.views.TreeViewerTest.ViewContentProvider;
import testpreference.views.TreeViewerTest.ViewLabelProvider; public class TextViewerTest extends ViewPart {
public static final String ID = "testpreference.views.TreeViewerTest";
private TextViewer viewer; public TextViewerTest() {
// TODO Auto-generated constructor stub
} public void createPartControl(Composite parent) {
viewer = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL);
String str = "this is test \n this is test";
Document document = new Document(str);
viewer.setDocument(document); TextPresentation style = new TextPresentation();
style.addStyleRange(new StyleRange(,,null,null,SWT.BOLD));
viewer.changeTextPresentation(style, true); viewer.setInput(getSite());
} public void setFocus() {
// TODO Auto-generated method stub } }

【插件开发】—— 10 JFace开发详解的更多相关文章

  1. EasyPR--开发详解(6)SVM开发详解

    在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...

  2. 【转发】NPAPI开发详解,Windows版

    NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...

  3. 嵌入式Linux应用程序开发详解------(创建守护进程)

    嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...

  4. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  5. opencart 模块开发详解

    opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每 ...

  6. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  7. [转载]Apple Watch 开发详解

    Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕.暂时WatchKit没有能给出足够的接口.现在Watch App的主要运算逻辑需要依赖iPho ...

  8. Apple Watch 开发详解

    Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕.暂时WatchKit没有能给出足够的接口.现在Watch App的主要运算逻辑需要依赖iPho ...

  9. 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程

    产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...

随机推荐

  1. Python数据分析常用的库总结

    Python之所以能够成为数据分析与挖掘领域的最佳语言,是有其独特的优势的.因为他有很多这个领域相关的库可以用,而且很好用,比如Numpy.SciPy.Matploglib.Pandas.Scikit ...

  2. 【神乎其神】这些EXCEL技巧,太神奇了,赶紧收藏!

    转:http://learning.sohu.com/20160215/n437421658.shtml

  3. Android NFC近场通信02----读写卡的准备工作

                        Android NFC近场通信02----读写卡的准备工作      因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...

  4. Python - 多次检查后缀名(endwith)

    在通过后缀名查找类型文件的时候, 多次使用endwith, 使用元组(tuple), 简化操作. 此类方式, 也能够应用于if语句多次类似检測. 代码 # 列出目录内全部代码 def list_dic ...

  5. react-document-title

    根据不同的路由改变文档的title 使用该组件: import ReactDocumentTitle from 'path/ReactDocumentTitle' render() { return ...

  6. Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡

     <Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡> 之前基于github上的第三方开源控件ViewPagerIndicator的UnderlinePa ...

  7. iOS音频播放 (四):AudioFile 转

    原文出处 : http://msching.github.io/blog/2014/07/19/audio-in-ios-4/ 前言 接着第三篇的AudioStreamFile这一篇要来聊一下Audi ...

  8. 【IOS】启动画面

    总述: 两种方式,一种是使用系统自带的.按规则定义启动图片名称就可以,显示为1秒,要想延长时间,用[nsthread ​ sleepForTimeInterval:5.0] ,还有一种就是自己定义ui ...

  9. PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程

    什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 ...

  10. Synthesizing Images of Humans in Unseen Poses

    Synthesizing Images of Humans in Unseen Poses balakg/posewarp-cvpr2018 https://github.com/balakg/pos ...