一. 目标
-
能够选中Table,移动Table的位置,调整Table的大小。
-
可以支持撤销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
用于具体执行对模型的修改:
-
execute() 执行操作,在这里就是执行大小或位置调整,并保存旧的现场。
-
undo() 撤销操作,其实就是从前面保存的现场,恢复到原来的大小和位置。
-
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)的区别。
-
Command在执行后,都会被放入CommandStack。
-
UndoAction其实就是在CommandStack中,找到最后执行过的Command,调用其Undo方法。
-
同样的,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
是由于复合按键比单按键复杂,可以见我的另一篇博客。
十. 总结
-
认识了XYLayoutEditPolicy和简单的Command
-
认识了和Action想关的KeyHandle、KeyStroke、CommandStack、ActionRegistry
分享到:
相关推荐
GEF 全称 Graphical Editor Framework 。它是一个基于 eclipse 的图形化编辑框架。通过它,开发人员可以方便的以图形化的方式(而非文本的方式)展示和编辑模型。
**GEF学习体会与经验总结** GEF,全称Graphical Editing Framework,是Eclipse组织开发的一个图形编辑框架,主要用于构建可自定义的图形化编辑工具。它为开发者提供了丰富的API和工具,使得创建复杂的图形用户界面...
**Gef 学习总结** Gef,全称为 Graph Editor Framework,是一个强大的图形编辑框架,主要用于构建可视化的图形编辑工具。在IT行业中,Gef通常与EMF(Eclipse Modeling Framework)结合使用,用于创建复杂的建模和...
【GEF研究总结】 GEF(Graphical Editor Framework)是一个专为开发图形化编辑应用程序的框架,它使得开发者可以通过图形化方式展示和编辑模型,从而提高用户体验。在各种图形化编辑应用中,如UML类图编辑器、XML...
**GEF教程及DEMO源码详解** ...总结,GEF教程及DEMO源码的学习,不仅能帮助开发者理解图形编辑框架的设计思想,还能掌握实际开发中的关键技术点。通过实践,可以快速上手并开发出满足特定需求的图形编辑工具。
这些示例涵盖了GEF的基本用法和高级特性,包括图元的创建、拖放操作、撤销/重做机制、以及事件处理等。 通过深入研究这两个压缩包,开发者可以学习如何结合使用GEF和Zest来创建强大的图形编辑器。这可能涉及到以下...
4. **删除、撤销和重做**:提供了基本的编辑历史管理,方便用户纠正错误。 5. **直接编辑**:可以直接在图形元素上进行文本或属性修改。 6. **概述和缩放**:通过概述视图查看整个模型,缩放功能则能深入查看细节。 ...
模型负责存储数据,视图负责显示数据,EditPart作为模型和视图之间的桥梁,Figure处理图形绘制,而Command则处理用户操作,确保可撤销/重做功能。 2. **模型-视图-控制器模式(MVC)** GEF遵循MVC设计模式,将业务...
- `org.eclipse.gef.commands.Command`:命令模式在GEF中用于执行可撤销/重做的操作,如添加、删除或修改图形元素。 - `org.eclipse.gef.requests.Request`:表示用户或系统对编辑域的某种请求,如创建新对象或选择...
GEF的命令框架(Command Framework)使得操作可撤销/重做。 5. **连接器(Connectors)**: 连接器用于创建和管理图形元素之间的连接。在GEF中,`ConnectionEditPart`负责绘制和编辑连接线。 6. **适配器(Adapter)**:...
Java GEF(Graphical Editing Framework)开发实例是一个深入理解并应用GEF框架的优秀实践案例。GEF是Eclipse平台上用于构建图形编辑器的库,它提供了构建图形用户界面(GUI)所需的基础结构,尤其适合创建复杂的...
5. **命令(Commands)**:GEF使用命令模式来处理用户的操作,每个图形编辑操作都对应一个命令对象,便于撤销/重做操作。 6. **手势( Gestures)**:手势处理用户输入,如鼠标点击、拖放等,将这些输入转化为图形...
这种设计模式使得操作具有可撤销/重做能力,并能保持模型与视图的一致性。 在GEF中,EditPart是图形元素的表示,它们负责绘制图形并响应用户交互。EditPart可以通过`createEditPolicies()`方法安装所需的Policy。...
4. **Command**: 命令模式是GEF中的一个重要概念,用于管理用户的编辑操作,确保可撤销/重做功能。 **四、GEF编程基础** 1. **创建模型**: 使用EMF生成模型类,定义数据结构。 2. **定义EditPart**: 编写EditPart...
6. **命令框架**:支持可撤销/重做的命令模式,确保用户操作的可逆性。 7. **图元选择**:提供了多种选择模式,包括单选、多选和矩形选择等。 8. **布局管理器**:提供了各种布局策略,如树状布局、网格布局等,可以...
4. **删除、撤销和重做**:提供基本的编辑操作,允许用户撤销和重做他们的改动。 5. **直接编辑**:用户可以直接在图形元素上进行文本编辑,无需打开单独的对话框。 6. **概述与缩放**:提供缩略图视图以便于整体...
4. **命令架构**:GEF的命令架构保证了操作的可撤销/重做,所有对模型的修改都是通过命令对象完成的,这使得系统的行为更加可控。 **三、学习资源** 本教程附带的"GEF_Tutorial.pdf"文件,很可能是详细的实践指南,...
**GEF(Graphical Editing Framework)开发整合资料大全** **GEF是什么?** GEF(Graphical Editing Framework)是Eclipse平台下的一款用于构建图形化编辑器的框架,它为开发者提供了一套全面的工具和API,使得创建...