您的位置:首页 > 其它

RCP开发中25个知识点

2014-05-24 14:22 106 查看
1设置子控件与父控件的背景颜色相同的,可在父控件的高级属性中,设置backgroundMode模式。
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"的方式,不是很完美,而且相对复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: