【插件开发】—— 10 JFace开发详解
前文回顾:
1 插件学习篇
4 SWT编程须知
7 SWT布局详解
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开发详解的更多相关文章
- EasyPR--开发详解(6)SVM开发详解
在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...
- 【转发】NPAPI开发详解,Windows版
NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- opencart 模块开发详解
opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每 ...
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
- [转载]Apple Watch 开发详解
Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕.暂时WatchKit没有能给出足够的接口.现在Watch App的主要运算逻辑需要依赖iPho ...
- Apple Watch 开发详解
Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕.暂时WatchKit没有能给出足够的接口.现在Watch App的主要运算逻辑需要依赖iPho ...
- 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程
产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...
随机推荐
- Python数据分析常用的库总结
Python之所以能够成为数据分析与挖掘领域的最佳语言,是有其独特的优势的.因为他有很多这个领域相关的库可以用,而且很好用,比如Numpy.SciPy.Matploglib.Pandas.Scikit ...
- 【神乎其神】这些EXCEL技巧,太神奇了,赶紧收藏!
转:http://learning.sohu.com/20160215/n437421658.shtml
- Android NFC近场通信02----读写卡的准备工作
Android NFC近场通信02----读写卡的准备工作 因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...
- Python - 多次检查后缀名(endwith)
在通过后缀名查找类型文件的时候, 多次使用endwith, 使用元组(tuple), 简化操作. 此类方式, 也能够应用于if语句多次类似检測. 代码 # 列出目录内全部代码 def list_dic ...
- react-document-title
根据不同的路由改变文档的title 使用该组件: import ReactDocumentTitle from 'path/ReactDocumentTitle' render() { return ...
- Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡
<Android ViewPager实现Tabhost选项卡底部滑块动态滑动过渡> 之前基于github上的第三方开源控件ViewPagerIndicator的UnderlinePa ...
- iOS音频播放 (四):AudioFile 转
原文出处 : http://msching.github.io/blog/2014/07/19/audio-in-ios-4/ 前言 接着第三篇的AudioStreamFile这一篇要来聊一下Audi ...
- 【IOS】启动画面
总述: 两种方式,一种是使用系统自带的.按规则定义启动图片名称就可以,显示为1秒,要想延长时间,用[nsthread sleepForTimeInterval:5.0] ,还有一种就是自己定义ui ...
- PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程
什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 ...
- Synthesizing Images of Humans in Unseen Poses
Synthesizing Images of Humans in Unseen Poses balakg/posewarp-cvpr2018 https://github.com/balakg/pos ...