`
lggege
  • 浏览: 375460 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GEF实践总结(五)大小调整、按键监听、撤销重做

    博客分类:
  • GEF
阅读更多

一. 目标

  1. 能够选中Table,移动Table的位置,调整Table的大小。
  2. 可以支持撤销Undo和重做Redo。


二. 给DataBase书写XYLayoutEditPolicy
书写一个DataBaseXYLayoutEditPolicy 类继承与XYLayoutEditPolicy

public class DataBaseXYLayoutEditPolicy extends XYLayoutEditPolicy {
@Override
protected Command createChangeConstraintCommand(EditPart child, Object constraint) {
return null;
}
@Override
protected Command getCreateCommand(CreateRequest request) {
return null;
}
}

 

将其注册于DataBaseEditPart

@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.LAYOUT_ROLE, new DataBaseXYLayoutEditPolicy());
}
 


启动后查看效果:


好了,就这么简单,已经可以选中Table了,选中后会出现边框,而且边框还有8个可用于调整大小的瞄点出现。


问题一: 为什么为了操作Table,而去给DataBase注册LayoutEditPolicy呢?
这是由于LayoutEditPolicy是用于对它上面的子EditPart而言的,这就SWT中给Composite设置GridLayout或FillLayout,具体怎么布局也是对于Composite上的子控件而言的。


问题二: 为什么注册了LayoutEditPolicy就会有选择框呢?
关心的话,可以去看ConstrainedLayoutEditPolicy.createChildEditPolicy的具体方法。


三. 书写Table执行调整大小的Command

public class TableChangeConstraitCommand extends Command {
private TableModel table;
private Rectangle oldRect;
private Rectangle newRect;
public TableChangConstraitCommand(TableModel table, Rectangle newRect) {
this.table = table;
this.newRect = newRect;
}
@Override
public void execute() {
oldRect = new Rectangle(table.getX(), table.getY(), table.getW(), table.getH());
table.setXYWH(newRect.x, newRect.y, newRect.width, newRect.height);
}
@Override
public void undo() {
table.setXYWH(oldRect.x, oldRect.y, oldRect.width, oldRect.height);
}
}
 



Command 用于具体执行对模型的修改:

  1. execute() 执行操作,在这里就是执行大小或位置调整,并保存旧的现场。
  2. undo()    撤销操作,其实就是从前面保存的现场,恢复到原来的大小和位置。
  3. redo()    重新执行 (如果不覆盖,其实就是执行execute方法)


这就是设计模型里面的Command模式,Command对象在被执行后,会保存在EditDomain CommandStack 中,用以支持Ctrl+Z的undo撤销操作,或者Ctry+Y的redo重新执行。

四. 改写DataBase的XYLayoutEditPolicy,支持大小调整

public class DataBaseXYLayoutEditPolicy extends XYLayoutEditPolicy {
@Override
protected Command createChangeConstraintCommand(EditPart child, Object constraint) {
TableModel table = (TableModel) child.getModel();
Rectangle rect = (Rectangle) constraint;

TableChangeConstraitCommand command = new TableChangeConstraitCommand(table, rect);
return command;
}
让DataBaseXYLayoutEditPolicy在createChangeConstraintCommand方法中返回一个TableChangeConstraitCommand即可。
 


五. 启动,查看效果



六. 给GraphicalViewer注册KeyHandle

        KeyHandler keyHandler = new KeyHandler();
        graphicalViewer.setKeyHandler(new GraphicalViewerKeyHandler(graphicalViewer).setParent(keyHandler));
        keyHandler.put(KeyStroke.getPressed(SWT.F1, SWT.NONE), new RedoAction(this));
        keyHandler.put(KeyStroke.getPressed(SWT.F2, SWT.NONE), new UndoAction(this));


KeyHandle :是对于按键的监听
KeyHandle可以使用setParent方法将多个KeyHandle组成按键的监听链,按键的监听从最下面一个KeyHandle一直往上遍历,只要其中一个KeyHandle对某一按键监听了,就执行对应的Action。
KeyHandler通过KeyStorke(按键、复合按键) 和 Action进行对应。
注意: 按键有按下(getPressed)和弹起(getReleased)的区别。

  1. Command在执行后,都会被放入CommandStack。
  2. UndoAction其实就是在CommandStack中,找到最后执行过的Command,调用其Undo方法。
  3. 同样的,RedoAction就是在CommandStatck中,找到最后一次Undo的Command,执行其redo方法。


七. 为ViewPart返回CommandStack

由于RedoAction UndoAction 需要依赖CommandStack ,通过ViewPart.getAdapter(CommandStack.class) 获得CommandStack对象,于是,我们需要给ViewPart返回CommandStack 对象,而它又存在于在EditDomain 中。

    @Override
    public Object getAdapter(Class adapter)
    {
        if ( CommandStack.class.equals(adapter) )
        {
            return this.graphicalViewer.getEditDomain().getCommandStack();
        }
        return super.getAdapter(adapter);
    }

 

好了,完成了,在你调整完了Table的大小后,可以使用F1、F2进行撤销和重做。

八. 改用ActionRegistry
由于在其他地方还需要使用RedoAction UndoAction ,那么你可以考虑使用ActionRegister ,将Action对象初始化完毕后,再缓存在ActionRegister 里面。

        //
        actionRegistry.registerAction(new RedoAction(this));
        IAction action = actionRegistry.getAction(ActionFactory.REDO.getId());
        keyHandler.put(KeyStroke.getPressed(SWT.F1, SWT.NONE), action);
       
        actionRegistry.registerAction(new UndoAction(this));
        action = actionRegistry.getAction(ActionFactory.UNDO.getId());
        keyHandler.put(KeyStroke.getPressed(SWT.F2, SWT.NONE), action);
    }
   
    private ActionRegistry actionRegistry = new ActionRegistry();
 



九. 其他
问题: 为什么按键选用F1和F2,而不是通常的Ctrl+Z和Ctrl+Y
是由于复合按键比单按键复杂,可以见我的另一篇博客。

十. 总结

  1. 认识了XYLayoutEditPolicy和简单的Command
  2. 认识了和Action想关的KeyHandle、KeyStroke、CommandStack、ActionRegistry

 

 

2
0
分享到:
评论
1 楼 xmind 2010-05-25  
 

相关推荐

    GEF学习总结

    GEF 全称 Graphical Editor Framework 。它是一个基于 eclipse 的图形化编辑框架。通过它,开发人员可以方便的以图形化的方式(而非文本的方式)展示和编辑模型。

    GEF学习体会与经验总结(.doc)

    **GEF学习体会与经验总结** GEF,全称Graphical Editing Framework,是Eclipse组织开发的一个图形编辑框架,主要用于构建可自定义的图形化编辑工具。它为开发者提供了丰富的API和工具,使得创建复杂的图形用户界面...

    Gef 学习总结

    **Gef 学习总结** Gef,全称为 Graph Editor Framework,是一个强大的图形编辑框架,主要用于构建可视化的图形编辑工具。在IT行业中,Gef通常与EMF(Eclipse Modeling Framework)结合使用,用于创建复杂的建模和...

    GEF研究总结

    【GEF研究总结】 GEF(Graphical Editor Framework)是一个专为开发图形化编辑应用程序的框架,它使得开发者可以通过图形化方式展示和编辑模型,从而提高用户体验。在各种图形化编辑应用中,如UML类图编辑器、XML...

    GEF教程及demo源码

    **GEF教程及DEMO源码详解** ...总结,GEF教程及DEMO源码的学习,不仅能帮助开发者理解图形编辑框架的设计思想,还能掌握实际开发中的关键技术点。通过实践,可以快速上手并开发出满足特定需求的图形编辑工具。

    GEF Example Source Code

    这些示例涵盖了GEF的基本用法和高级特性,包括图元的创建、拖放操作、撤销/重做机制、以及事件处理等。 通过深入研究这两个压缩包,开发者可以学习如何结合使用GEF和Zest来创建强大的图形编辑器。这可能涉及到以下...

    IBM GEF 推广资料

    4. **删除、撤销和重做**:提供了基本的编辑历史管理,方便用户纠正错误。 5. **直接编辑**:可以直接在图形元素上进行文本或属性修改。 6. **概述和缩放**:通过概述视图查看整个模型,缩放功能则能深入查看细节。 ...

    GEF教程及demo源码GEF_RCP_DEMO.zip

    模型负责存储数据,视图负责显示数据,EditPart作为模型和视图之间的桥梁,Figure处理图形绘制,而Command则处理用户操作,确保可撤销/重做功能。 2. **模型-视图-控制器模式(MVC)** GEF遵循MVC设计模式,将业务...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    - `org.eclipse.gef.commands.Command`:命令模式在GEF中用于执行可撤销/重做的操作,如添加、删除或修改图形元素。 - `org.eclipse.gef.requests.Request`:表示用户或系统对编辑域的某种请求,如创建新对象或选择...

    GEF入门学习例子

    GEF的命令框架(Command Framework)使得操作可撤销/重做。 5. **连接器(Connectors)**: 连接器用于创建和管理图形元素之间的连接。在GEF中,`ConnectionEditPart`负责绘制和编辑连接线。 6. **适配器(Adapter)**:...

    java gef开发实例

    Java GEF(Graphical Editing Framework)开发实例是一个深入理解并应用GEF框架的优秀实践案例。GEF是Eclipse平台上用于构建图形编辑器的库,它提供了构建图形用户界面(GUI)所需的基础结构,尤其适合创建复杂的...

    GEF 进阶+源码.rar

    5. **命令(Commands)**:GEF使用命令模式来处理用户的操作,每个图形编辑操作都对应一个命令对象,便于撤销/重做操作。 6. **手势( Gestures)**:手势处理用户输入,如鼠标点击、拖放等,将这些输入转化为图形...

    GEF理解系列三

    这种设计模式使得操作具有可撤销/重做能力,并能保持模型与视图的一致性。 在GEF中,EditPart是图形元素的表示,它们负责绘制图形并响应用户交互。EditPart可以通过`createEditPolicies()`方法安装所需的Policy。...

    GEF 入门教程

    4. **Command**: 命令模式是GEF中的一个重要概念,用于管理用户的编辑操作,确保可撤销/重做功能。 **四、GEF编程基础** 1. **创建模型**: 使用EMF生成模型类,定义数据结构。 2. **定义EditPart**: 编写EditPart...

    GEF 3.10 eclipse 插件

    6. **命令框架**:支持可撤销/重做的命令模式,确保用户操作的可逆性。 7. **图元选择**:提供了多种选择模式,包括单选、多选和矩形选择等。 8. **布局管理器**:提供了各种布局策略,如树状布局、网格布局等,可以...

    eclipse gef原理的详细介绍PPT,很有参考价值

    4. **删除、撤销和重做**:提供基本的编辑操作,允许用户撤销和重做他们的改动。 5. **直接编辑**:用户可以直接在图形元素上进行文本编辑,无需打开单独的对话框。 6. **概述与缩放**:提供缩略图视图以便于整体...

    GEF教程,注重实践。

    4. **命令架构**:GEF的命令架构保证了操作的可撤销/重做,所有对模型的修改都是通过命令对象完成的,这使得系统的行为更加可控。 **三、学习资源** 本教程附带的"GEF_Tutorial.pdf"文件,很可能是详细的实践指南,...

    GEF开发整合资料大全

    **GEF(Graphical Editing Framework)开发整合资料大全** **GEF是什么?** GEF(Graphical Editing Framework)是Eclipse平台下的一款用于构建图形化编辑器的框架,它为开发者提供了一套全面的工具和API,使得创建...

Global site tag (gtag.js) - Google Analytics