快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时官网_龟发之家论坛



近情因为实验室义务繁重,不停没有继承钻研GEF,原先已经掌握的一些器械好象又损掉落了不少,真是无奈啊,看来照样要常常碰碰。刚刚打仗GEF的同伙大年夜都邑有这样的印象:GEF里观点太多,对照绕,一些能直接实现的功能非要拐几个弯到另一个类里做,而且很多类的名字十分相似,加上不知道他们的感化,感到就好象一团乱麻澳门24小时官网。我感觉这种环境是由图形用户界面(GUI)的繁杂性所抉择的,GUI看似简单,实际上包孕了相称多的逻辑,分外是GEF处置惩罚的这种图形编辑要领,可以说是最繁杂的一种。GEF里每一个类,应该说都有它存在的来由,我们要尽可能懂得作者的意图,这就必要多看文档亲睦的例子。

在Eclipse里查看文澳门24小时官网档和代码相称便利,比如我们对某个类的用法不清楚,一样平常首先找它的注释(选中类或措施按F2),其次可以查看它在其他地方用法(选中类或措施按Ctrl+Shift+G),还可以找它的源代码(Ctrl+鼠标左键或F3)来看,别的Ctrl+Shift+T可以按名称查找一个类等等。学GEF是少不了看代码的,当然还必要澳门24小时官网光阴和耐心。

好,闲话少说,下澳门24小时官网面进入正题。这篇帖子将继承上一篇内容,主要评论争论若何实现DirectEdit、属性页和大年夜纲视图,这些都是一个完备GEF利用法度榜样必要供给的基础功能。

实现DirectEdit

所谓DirectEdit(也称In-Place-Edit),便是容许用户在蓝本显示内容的地方直接对内容进行改动,例如在Windows资本治理器里选中一个文件,然后按F2键就可以开始改动文件名。实现DirectEdit的道理很直接:当用户发出改动哀求(REQ_DIRECT_EDIT)时,就在翰墨内容所在位置覆盖一个文本框(也可所以下拉框,这里我们只评论争论文本的环境)作为编辑器,编辑停止后,再将编辑器中的内容利用到模型里即可。(作为类似的功能请参考:给表格的单元格增添编辑功能)

图1 Direct Edit

在GEF里,这个弹出的编辑器由DirectEditManager类认真治理,在我们的NodePart类里,经由过程覆盖performRequest()措施响利用户的DirectEdit哀求,在这个措施里一样平常要构造一个DirectEditManager类的实例(例子中的NodeDirectEditManager),并传入需要的参数,包括吸收哀求的EditPart(便是自己,this)、编辑器类型(应用TextCellEditor)以及用来定位编辑器的CellEditorLocator(NodeCellEditorLocator),然后用show()措施使编辑器显示出来,而编辑器中显示的内容已经在构造措施里获得。简单看一下NodeCellEditorLocator类,它的关键措施在relocate()里,当编辑器里的内容改变时,这个措施被调用从而让编辑器始终处于精确的坐标位置。DirectEditManager有一个紧张的initCellEditor()措施,它的主要感化是设置编辑器的初始值。在我们的例子里,初始值设置为被编辑NodePart对应模型 (Node)的name属性值;这里还别的完成了设置编辑器字体和选中整个翰墨(selectAll)的功能,由于这样更相符一样平常应用习气。

在NodePart里还要增添一个角色为DIRECT_EDIT_ROLE的EditPolicy,它应该承袭自DirectEditPolicy,有两个措施必要实现:getDirectEditCommand()和showCurrentEditValue(),虽然还未碰到过,但前者的感化你不应该认为陌生--在编辑停止时天生一个Command工具将改动结果感化到模型;后者的目的是更新Figure中的显示,虽然我们的编辑器覆盖了Figure中的文本,彷佛并不必要管Figure的显示,但在编辑中时候维持这两个文本的同等才不会呈现"盖不住"的环境,例如当编辑器里的文本较短时。

private Control outline;

public OutlinePage() {

super(new TreeViewer());

}

public void createControl(Composite parent) {

outline = getViewer().createControl(parent);

getSelectionSynchronizer().addViewer(getViewer());

getViewer().setEditDomain(getEditDomain());

getViewer().setEditPartFactory(new TreePartFactory());

getViewer().setContents(getDiagram());

}

因为我们在构造措施里指定了应用树布局显示大年夜纲,以是createControl()里的第一句就会使outline变量获得一个Tree(见org.eclipse.gef.ui.parts.TreeViewer的代码),第二句把TreeViewer加到选择同步器中,从而让用户不论在大年夜纲或编辑区域里选择EditPart时,另一方都能自动做出同样的选择;着末三行的感化在曩昔的帖子里都有先容,总体目的是把大年夜纲视图的模型与编辑区域的模型联系在一路,这样,对付同一个模型我们就有了两个视图,体会到MVC的好处了吧。

实现大年夜纲视图最紧张的事情基础便是这些,但还没有完,我们要在init()措施里绑定UNDO/REDO/DELETE等敕令到Eclipse主窗口,否则昔时夜纲视图处于活动状态时,主对象条上的这些敕令就会变为弗成用状态;在 getControl()措施里要返回我们的outline成员变量,也便是指定让这个控件呈现在大年夜纲视图中;在dispose()措施里应该把这个TreeViewer从选择同步器中移除;着末,必须在PracticeEditor里覆盖getAdapter()措施,前面说过,这个措施是在Editor激活时被大年夜纲视图调用的,以是在这里必须把我们实现好的OutlinePa澳门24小时官网ge返回给大年夜纲视图应用,代码如下:

public Object getAdapter(Class type) {

if (type == IContentOutlinePage.class)

return new OutlinePage();

return super.getAdapter(type);

}

这样,树型大年夜纲视图就完成了,见下图。很多GEF利用法度榜样同时具有树型和缩略图两种大年夜纲,实现的基础思路是一样的,但代码会轻细繁杂一些,由于这两种大年夜纲一样平常要经由过程一个PageBook进行切换,缩略图一样平常由org.eclipse.draw2d.parts.ScrollableThumbnail认真实现,这里暂时不讲了(大概今后会具体说),你也可以经由过程看logic例子的LogicEditor这个类的代码来懂得。

图3 大年夜纲视图

P.S.写这篇帖子的时刻,我对例子又做了一些改动,都是和这篇帖子所说的内容相关的,以是假如你曩昔下载过,会发明那时的代码与现在稍有不合(功能照样完全一样的,下载)。别的要说一下,这个例子并不完善,比如删除一个节点的时刻,它的连接就没同时删除,一些键盘快捷键不起感化,还存在很多被注释掉落的代码等等。假如有兴趣你可以来改动它们,也是不错的进修道路。

您可能还会对下面的文章感兴趣: