RCP开发中25个知识点

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监听器被触发时才会构建真实的数据项。当然可视区域变化时,也会触发这个事件。


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的安装

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)。增量包是一个支持跨操作系统导出产品的开发包。

安装:进行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"的方式,不是很完美,而且相对复杂。

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值