RCP开发中25个知识点
2014-05-24 14:22
106 查看
1设置子控件与父控件的背景颜色相同的,可在父控件的高级属性中,设置backgroundMode模式。
2对于link控件只是在界面中提供了对应到网页中链接的样式。
真正的打开网页还是需要手工实现的。
可以:
3对于托盘的使用,首先是从当前系统中得到托盘对象
final Tray tray = Display.getCurrent().getSystemTray();
如果不为空,则说明此系统是支持托盘的使用的。
然后相应的创建托盘item,以及为其添加右击事件,设置右击菜单。具体代码如下:
4对于table大量的数据的加载,为了避免程序假死,可以利用thread来实现数据的获取,而真正的item添加,则可以采用Display.getDefault().syncExec()来实现。
5针对4的另一个方法是使用virtual table
相对4的方法,Virtual Table更加节省系统资源,4虽然可以使界面不再出现阻塞,但是它会在创建所有的TableItem,而不管是否需要立即显示和查看这些TableItem。而Virtual Table只有在需要显示时才会实际创建那些数据项。
关键在于要为table指定一个SetData的监听器。
在指定这个类型的监听器时,每当下拉滚动条时,会创建一个item,也不是event.item。然后会根据对应的索引得到数据对象中的对于这个item应该设置的属性。
所以在一开始要为table指定数据对象。
并要告知数据对象一共有多少个。
table.setItemCount(100);
table.setData(query(null));
Virtual Table只有在setData监听器被触发时才会构建真实的数据项。当然可视区域变化时,也会触发这个事件。
另可见http://www.eclipse.org/articles/Article-SWT-Virtual/Virtual-in-SWT.html
5对于tree的要复杂一点。先看一下效果图:
主要是在创建根节点时,创建相应的loading节点,然后用一个线程去计算相应的子节点,等数据计算好,Display.getDefault().syncExec()运行,加载相应的item,最后把loading这个节点给销毁。
也就是上面的图片想传达的。需要注意是一个递归的调用,因为str+0也是可以继续展开的。
6.JFace Viewer的框架机制
input,作为输入Viewer的数据模型,可以是一个数组、集合或其他类型。
contentProvider(内容提供者)是用于规范领域模型数据的输入。对input的内容进行结构化,用户自定义的content provider一般需要实现IStructedContentProvider接口,格式化输入的数据源。ContentProvide将input的数据源处理成一个数组返回。
LabelProvider(标签提供者)用于把Content Provider、ViewerFilter和ViewerSorter中处理好的数据显示在Viewer上,通常LabelProvider逐个获取数组中的模型数据,然后处理每个数据项的显示方式,比如格式化文本内容、颜色、字体和图片等。
7.TableViewer解析
对于LabelProvider,可实现ITableLabelProvider以供实现在table中的相应设置。
另一个处理列数据展示的编程方法,可以不使用ITableLabelProvider接口,而是为每一个TableViewerColumn设置一个ColumnLabelProvider,只针对某一列来处理。但是必须为每一个TableViewerColumn都设置ColumnLabelProvider,否则会抛出异常。这种方法略显麻烦,但也获得了一些好处,ColumnLabelProvider继承了CellLabelProvider、IFontProvider和IColorProvider等接口。不但可以处理每列的文本和图片标签,还能设置字体、颜色和ToolTip效果。
8.TreeViewer设计
需要实现ITreeContentProvider接口。由于tree是有子节点的特性。
9.CheckboxTableViewer
与tableViewer很类似,但有一点就是数据展示过程中控制那些数据项显示复选框的状态。ICheckStateProvider就是用来解决这个问题的,复选框实际上有两种状态:checked与grayed。使用CheckboxTableViewer提供的setCheckStateProvider接口设置ICheckStateProvider,根据之前
10.数据绑定,会报org.eclipse.core.runtime.AssertionFailedException: null argument:Validation realm cannot be null异常,错误代码为自动生成的
DataBindingContext bindingContext = new DataBindingContext();
是由于Realm.getDefault()为null带来的异常。
11.对于可编辑表格的使用
可以直接利用
中editingSupport来设定。
以下为自动生成的代码:
12.当然上面需要为每一个tableViewerColumn设置相应的EditingSupport,非常烦琐。提供了一种ICellModifier接口的方式来实现表格的编辑。
复活 乔任梁
在上面的使用虽然很简单,但在某种情况下是复杂的。对于当前的方法,要准备一个CellEditor[]和一个ICellModifier。前者告知表格采用什么类型的editor进行修改。后者决定修改操作。这里要注意的是必须为tableViewer设定properties如下:
13.自定义编辑器(有样学样)
14.ITableLabelProvider ITableFontProvider ITableColorProvider
15.新建FormEditor的编辑器。可以新建MultiPageEditorPart时,修改superclass为org.eclipse.ui.forms.editor.FormEditor.其中添加的页继承自FormPage.
16. MasterDetailsBlock与IDetailsPage是一种具有主从关系的页面组件。
17.对于Eclipse Nebula Plugin的安装
地址http://download.eclipse.org/technology/nebula/snapshot
18.修改eclipse的提示时间,如图
去除鼠标悬停的提示如图
19当使用RCP向导创建一个最小的应用程序时,PDE会自动创建一个Applicatioin的扩展,与java的main方法类似,该类是RCP应用程序的主要入口。通常可以在Application的start方法中启动一个登录对话框。虽然IApplication接口提供了启动和停止应用程序的两个public接口,但是不需要自己来调用启动和停止操作,框架平台会调用它们。
20具体以哪种按钮外观展现,则通过IContributionManager接口的实现类来完成。
PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants.
SHOW_TRADITIONAL_STYLE_TABS, true);
21帮助
以上toc.xml代表了目录结构,同时才设置好了对应的页面。
上面这种略有不同,即他在toc1中又利用了一次xml,增加了复用的可能。注意link_to的写法toc1.xml是指引用的这个文件#后是指id.
这是相应的依赖项:
22注意利用word生成的html中的图片文件夹都是.files但在eclipse中要修改这个文件夹,使其是普通的文件夹名即可。并且要在.html文件所在的同一级目录中。
23.Bable语言包安装站点
Indigo http://download.eclipse.org/technology/babel/update-site/R0.9.1/indigo 但存在问题。
24.跨平台导出,需要安装一个RCP增量包(DeltaPack)。增量包是一个支持跨操作系统导出产品的开发包。
去http://download.eclipse.org/eclipse/downloads/drops/R-3.7.1-201109091335/index.php 或
http://archive.eclipse.org/eclipse/downloads/drops/R-3.7.1-201109091335/index.php 进行下载
安装:进行eclipse-preferences-plug-in Development-Target Platform 选择当前的Active的Target Platform,单击edit按钮。
在当前的Target Content基础上安装增量包,将安装路径指向DeltaPack的解压缩后的路径。
至此,重新导出产品时,导出选项组多了一个Export For multiple Platform的设置,勾选这个选项。导出的对话框与之前相比还多了一个跨平台导出的页面,现在能够一次开发多平台导出了。
23.插件回路依赖的解决方案?
24.运行依赖,是指在RCP应用程序的运行配置中没有同步这些新添加的插件依赖信息。解决方案:
1)直接删除Eclipse Application下指定的节点,然后生死格斗运行应用程序。
2)或者手工同步,在Run configuration中选择plug-ins标签,单击Add Require Plug-ins.
25.导出RCP后乱码
在build.properties文件中,加入javacDefaultEncoding.. = UTF-8 就彻底解决问题了。
目前网上流传的勾选Custom Build,再用PDE Tools -> Create Ant Build File,然后在build.xml里面的javac添加属性encoding="UTF-8"的方式,不是很完美,而且相对复杂。
2对于link控件只是在界面中提供了对应到网页中链接的样式。
真正的打开网页还是需要手工实现的。
可以:
protected void openBrowserBySWTProgram(String text2) throws IOException { //1.Program.launch(text2); /*2. java.net.URI uri=java.net.URI.create(text2); java.awt.Desktop dp=java.awt.Desktop.getDesktop(); if(dp.isSupported(java.awt.Desktop.Action.BROWSE)) { dp.browse(uri); }*/ //3.在rcp应用可使用 PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(text2)); }
3对于托盘的使用,首先是从当前系统中得到托盘对象
final Tray tray = Display.getCurrent().getSystemTray();
如果不为空,则说明此系统是支持托盘的使用的。
然后相应的创建托盘item,以及为其添加右击事件,设置右击菜单。具体代码如下:
private TrayItem initTrayItem(IWorkbenchWindow window) { final Tray tray = Display.getCurrent().getSystemTray(); if (tray == null) { return null; } TrayItem trayItem = new TrayItem(tray, SWT.NONE); trayImage = Activator.getImageDescriptor("icons/alt_window_16.gif") .createImage(); trayItem.setImage(trayImage); trayItem.setToolTipText("TelMan"); return trayItem; } private void createPopupMenu(final IWorkbenchWindow window) { trayItem.addListener(SWT.MenuDetect, new Listener() { @Override public void handleEvent(Event arg0) { MenuManager trayMenu = new MenuManager(); Menu menu = trayMenu.createContextMenu(window.getShell()); actionBarAdvisor.fillTrayItem(trayMenu);// ?? menu.setVisible(true); } }); } public void fillTrayItem(MenuManager trayMenu) { trayMenu.add(aboutAction); //trayMenu.add(introAction); trayMenu.add(new Separator()); trayMenu.add(exitAction); }
4对于table大量的数据的加载,为了避免程序假死,可以利用thread来实现数据的获取,而真正的item添加,则可以采用Display.getDefault().syncExec()来实现。
5针对4的另一个方法是使用virtual table
相对4的方法,Virtual Table更加节省系统资源,4虽然可以使界面不再出现阻塞,但是它会在创建所有的TableItem,而不管是否需要立即显示和查看这些TableItem。而Virtual Table只有在需要显示时才会实际创建那些数据项。
关键在于要为table指定一个SetData的监听器。
table.addListener(SWT.SetData, new Listener() { @Override public void handleEvent(Event event) { TableItem item=(TableItem)event.item; int itemIndex=table.indexOf(item); Object[] obj=(Object[])table.getData(); item.setText(obj[itemIndex].toString()); System.out.println(obj[itemIndex].toString()); } });
在指定这个类型的监听器时,每当下拉滚动条时,会创建一个item,也不是event.item。然后会根据对应的索引得到数据对象中的对于这个item应该设置的属性。
所以在一开始要为table指定数据对象。
并要告知数据对象一共有多少个。
table.setItemCount(100);
table.setData(query(null));
Virtual Table只有在setData监听器被触发时才会构建真实的数据项。当然可视区域变化时,也会触发这个事件。
另可见http://www.eclipse.org/articles/Article-SWT-Virtual/Virtual-in-SWT.html
5对于tree的要复杂一点。先看一下效果图:
主要是在创建根节点时,创建相应的loading节点,然后用一个线程去计算相应的子节点,等数据计算好,Display.getDefault().syncExec()运行,加载相应的item,最后把loading这个节点给销毁。
也就是上面的图片想传达的。需要注意是一个递归的调用,因为str+0也是可以继续展开的。
6.JFace Viewer的框架机制
input,作为输入Viewer的数据模型,可以是一个数组、集合或其他类型。
contentProvider(内容提供者)是用于规范领域模型数据的输入。对input的内容进行结构化,用户自定义的content provider一般需要实现IStructedContentProvider接口,格式化输入的数据源。ContentProvide将input的数据源处理成一个数组返回。
LabelProvider(标签提供者)用于把Content Provider、ViewerFilter和ViewerSorter中处理好的数据显示在Viewer上,通常LabelProvider逐个获取数组中的模型数据,然后处理每个数据项的显示方式,比如格式化文本内容、颜色、字体和图片等。
7.TableViewer解析
对于LabelProvider,可实现ITableLabelProvider以供实现在table中的相应设置。
另一个处理列数据展示的编程方法,可以不使用ITableLabelProvider接口,而是为每一个TableViewerColumn设置一个ColumnLabelProvider,只针对某一列来处理。但是必须为每一个TableViewerColumn都设置ColumnLabelProvider,否则会抛出异常。这种方法略显麻烦,但也获得了一些好处,ColumnLabelProvider继承了CellLabelProvider、IFontProvider和IColorProvider等接口。不但可以处理每列的文本和图片标签,还能设置字体、颜色和ToolTip效果。
8.TreeViewer设计
需要实现ITreeContentProvider接口。由于tree是有子节点的特性。
9.CheckboxTableViewer
与tableViewer很类似,但有一点就是数据展示过程中控制那些数据项显示复选框的状态。ICheckStateProvider就是用来解决这个问题的,复选框实际上有两种状态:checked与grayed。使用CheckboxTableViewer提供的setCheckStateProvider接口设置ICheckStateProvider,根据之前
10.数据绑定,会报org.eclipse.core.runtime.AssertionFailedException: null argument:Validation realm cannot be null异常,错误代码为自动生成的
DataBindingContext bindingContext = new DataBindingContext();
是由于Realm.getDefault()为null带来的异常。
11.对于可编辑表格的使用
可以直接利用
中editingSupport来设定。
以下为自动生成的代码:
tableViewerColumn.setEditingSupport(new EditingSupport(tableViewer) { protected boolean canEdit(Object element) { return true; } protected CellEditor getCellEditor(Object element) { return new TextCellEditor(table); } protected Object getValue(Object element) { System.out.println("getvalue"); return ((MyData)element).getName(); } protected void setValue(Object element, Object value) { ((MyData)element).setName(value.toString()); getViewer().update(element, null); } });
12.当然上面需要为每一个tableViewerColumn设置相应的EditingSupport,非常烦琐。提供了一种ICellModifier接口的方式来实现表格的编辑。
复活 乔任梁
在上面的使用虽然很简单,但在某种情况下是复杂的。对于当前的方法,要准备一个CellEditor[]和一个ICellModifier。前者告知表格采用什么类型的editor进行修改。后者决定修改操作。这里要注意的是必须为tableViewer设定properties如下:
String[] prop=new String[]{"column1"}; tableViewer_1.setColumnProperties(prop); //设置编辑器 CellEditor[] ces=new CellEditor[]{new TextCellEditor(table_1),null}; tableViewer_1.setCellEditors(ces); //确定修改操作类 ICellModifier cm=new ICellModifier() { @Override public void modify(Object element, String property, Object value) { //对于这种方法传入的element是tableItem,而不是上一种EditingSupport方法传入的MyData对象 element=((Item)element).getData(); MyData md=(MyData)element; //这里property即为上面tableViewer设置的Property if(property.equalsIgnoreCase("column1")) { md.setName(value.toString()); } //注意此时element本质是对象md tableViewer_1.update(element, null); } @Override public Object getValue(Object element, String property) { if(property.equalsIgnoreCase("column1")) { return ((MyData)element).getName(); } return ""; } @Override public boolean canModify(Object element, String property) { return true; } }; tableViewer_1.setCellModifier(cm);
13.自定义编辑器(有样学样)
14.ITableLabelProvider ITableFontProvider ITableColorProvider
15.新建FormEditor的编辑器。可以新建MultiPageEditorPart时,修改superclass为org.eclipse.ui.forms.editor.FormEditor.其中添加的页继承自FormPage.
16. MasterDetailsBlock与IDetailsPage是一种具有主从关系的页面组件。
17.对于Eclipse Nebula Plugin的安装
地址http://download.eclipse.org/technology/nebula/snapshot
18.修改eclipse的提示时间,如图
去除鼠标悬停的提示如图
19当使用RCP向导创建一个最小的应用程序时,PDE会自动创建一个Applicatioin的扩展,与java的main方法类似,该类是RCP应用程序的主要入口。通常可以在Application的start方法中启动一个登录对话框。虽然IApplication接口提供了启动和停止应用程序的两个public接口,但是不需要自己来调用启动和停止操作,框架平台会调用它们。
20具体以哪种按钮外观展现,则通过IContributionManager接口的实现类来完成。
PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants.
SHOW_TRADITIONAL_STYLE_TABS, true);
21帮助
以上toc.xml代表了目录结构,同时才设置好了对应的页面。
上面这种略有不同,即他在toc1中又利用了一次xml,增加了复用的可能。注意link_to的写法toc1.xml是指引用的这个文件#后是指id.
这是相应的依赖项:
22注意利用word生成的html中的图片文件夹都是.files但在eclipse中要修改这个文件夹,使其是普通的文件夹名即可。并且要在.html文件所在的同一级目录中。
23.Bable语言包安装站点
Indigo http://download.eclipse.org/technology/babel/update-site/R0.9.1/indigo 但存在问题。
24.跨平台导出,需要安装一个RCP增量包(DeltaPack)。增量包是一个支持跨操作系统导出产品的开发包。
去http://download.eclipse.org/eclipse/downloads/drops/R-3.7.1-201109091335/index.php 或
http://archive.eclipse.org/eclipse/downloads/drops/R-3.7.1-201109091335/index.php 进行下载
安装:进行eclipse-preferences-plug-in Development-Target Platform 选择当前的Active的Target Platform,单击edit按钮。
在当前的Target Content基础上安装增量包,将安装路径指向DeltaPack的解压缩后的路径。
至此,重新导出产品时,导出选项组多了一个Export For multiple Platform的设置,勾选这个选项。导出的对话框与之前相比还多了一个跨平台导出的页面,现在能够一次开发多平台导出了。
23.插件回路依赖的解决方案?
24.运行依赖,是指在RCP应用程序的运行配置中没有同步这些新添加的插件依赖信息。解决方案:
1)直接删除Eclipse Application下指定的节点,然后生死格斗运行应用程序。
2)或者手工同步,在Run configuration中选择plug-ins标签,单击Add Require Plug-ins.
25.导出RCP后乱码
在build.properties文件中,加入javacDefaultEncoding.. = UTF-8 就彻底解决问题了。
目前网上流传的勾选Custom Build,再用PDE Tools -> Create Ant Build File,然后在build.xml里面的javac添加属性encoding="UTF-8"的方式,不是很完美,而且相对复杂。
相关文章推荐
- 写给前端新人:前端开发必会的25个知识点
- 前端开发必备25个知识点
- Eclipse开发RCP下使用第三方包
- 优秀的J2EE 开发工程师应该掌握的知识点
- RCP应用程序开发之三——如何打开多个工作台窗体
- RCP开发中Editor与View的选择
- RCP应用程序开发之四——应用程序窗体生成过程
- RCP开发 问题1则
- eclipse插件开发[用Eclipse RCP & ECF 实现 Google Talk客户端]
- 关于在RCP程序开发过程中遇到的:No Application ID has been found错误提示。
- 用Netbeans Platform开发RCP经验
- 优秀的J2EE 开发工程师应该掌握的知识点
- JAVA视频教程(三) - Plugin & RCP开发
- RCP应用程序开发之一——新建一个rcp application例子
- RCP应用程序开发之二——核心类总结
- ECLIPSE用VE进行RCP开发1:开发环境准备
- 优秀的J2EE 开发工程师应该掌握的知识点
- 近期开发计划:简单的邮件发送接受RCP程序
- RCP应用程序开发之四——应用程序窗体生成过程1
- EclipseRCP开发剪辑(3)--为RCP程序加入登陆窗口