【插件开发】—— 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. 商业价 ...
随机推荐
- Codeforces 659E New Reform【DFS】
题目链接: http://codeforces.com/problemset/problem/659/E 题意: 给定n个点和m条双向边,将双向边改为单向边,问无法到达的顶点最少有多少个? 分析: 无 ...
- 异常处理(try catch throw)详解(C++)
选择异常处理的编程方法的具体原因如下: 1.把错误处理和真正的工作分开来: 2.代码更易组织,更清晰,复杂的工作任务更容易实现: 3.毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了: 4 ...
- DELPHI跨平台的临界替代者
在WINDOWS里面使用临界来保护多线程需要访问的共享对象,现在,DELPHI有了新的跨平台临界保护者--System.TMonitor 代码演示如下: FConnections := TObject ...
- 关闭Windows 2003/2008中IE增强的安全配置的方法
在使用Windows Server 2003/2008操作系统时,打开IE浏览网页时,发现浏览器总提示 "是否需要将当前访问的网站添加到自己信任的站点中去",要是不信 ...
- How do you check if a variable is an array in JavaScript? [duplicate]
https://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript ...
- PHP的类中的常量,静态变量的问题。
自己在写一个小型的 angularJS 库的时候,觉得 javascript 中的很多概念有点像是PHP中的概念. 像类常量, 类中的静态变量(类的静态变量是类的所有实例都共享的),这些概念虽然在 j ...
- Linux集群的总结和思考
前言:在涉及到对外项目,经手许多小中型网站的架构,F5.LVS及Nginx都比较多,我想一种比较通俗易懂的语气跟大家说明下何谓负载均衡,何谓Linux集群,帮助大家走出这个误区,真正意义上来理解它们. ...
- Linux 将一般的用户加入sudo组is_not_in_the_sudoers_file._This_incident_will_be_reported解决方法
在一般用户下执行sudo命令提示xxx is not in the sudoers file. This incident will be reported.解决方法: $where ...
- oracle统计信息
手工刷ORACLE统计信息 select count(1) from LOG_TRX_DETAIL; select * from user_tab_statistics where table_n ...
- 切勿创建包括auto_ptr的容器对象
当你拷贝一个auto_ptr时,它所指向的对象的全部权被移交到拷入的auto_ptr上,而它自身被置为NULL.我的理解是:拷贝一个auto_ptr意味着改变它的值.比如: auto_ptr&l ...