`
liugang594
  • 浏览: 987531 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GEF理解系列七(2)

    博客分类:
  • GEF
 
阅读更多

二、放置EditManager

在GEF的EditPart里,有一个方法可以用来处理此事:performRequest();
那我们就把我们的EditManager放在这吧。如下:

      @Override

      public void performRequest(Request req) {

            if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {

                  HelloWorldDirectEditManager manager = new HelloWorldDirectEditManager(

                              this, TextCellEditor.class,

                              new HelloWorldCellEditorLocator((HelloWorldModel) getModel()));

                  manager.show();

            }else{

                  super.performRequest(req);

            }

      }

OK,现在我们再试一下:

directEdit1

图一

不过编辑完退出后,发现模型图上的文本内容并没有改变:为什么?你告诉我为什么?。。。知道了吧,还是刷新问题。这个简单,已经做了老多次了。修改HelloWorldModel,如下: 4、最后一个需要修改的类就是Policy类:HelloWorldDirectEditPolicy。修改控件类型,如下:

      public static final String P_TEXT = "p_text";

      public void setText(String text) {

            String old = this.text;

            this.text = text;

            firePropertyChange(P_TEXT, old, text);

      }

修改HelloWorldEditPart的propertyChange()方法如下:

      public void propertyChange(PropertyChangeEvent evt) {

            if (evt.getPropertyName().equals(HelloWorldModel.P_CONSTRAINT)) {

                  refreshVisuals();

            } else if (evt.getPropertyName().equals(HelloWorldModel.P_SOURCE)) {

                  refreshSourceConnections();

            } else if (evt.getPropertyName().equals(HelloWorldModel.P_TARGET)) {

                  refreshTargetConnections();

            }else if(evt.getPropertyName().equals(HelloWorldModel.P_TEXT)){

                  ((Label)getFigure()).setText(((HelloWorldModel)getModel()).getText());

            }

      }


这下再编辑修改就可以了。

补充:

在Policy里有一个方法:showCurrentEditValue()。这个方法在编辑控件出现后会被调用。你可以在这个方法里做一些事情。

performRequest()方法:并不是每种请求都是发送到Policy上。有一些请求也发送到performRequest方法上。一般来说它用来处理一些并不需要立即修改model的请求,比如说显示直接编辑控件 、双击事件等等。修改模型的时候还得需要Policy和Command的参与。

CompoundComand:还有一种命令是CompoundCommand命令。可以把一系列命令放到一个CompoundCommand对象里,然后返回这个对象。这样就相当于放在其中的一系列命令都被执行了。通常会有一些使用的场景。

三、ComboboxCellEditor

我们再试一种CellEditor。把上面的TextCellEditor改为ComboboxCellEditor。

这里我们有几个地方需要修改:

1.HelloWorldDirectEditManager类里:增加一个参数在构造函数里,用来初始化Combo的元素,最终修改如下:

public class HelloWorldDirectEditManager extends DirectEditManager {


      private String[] items;


      public HelloWorldDirectEditManager(GraphicalEditPart source,

                  Class editorType, CellEditorLocator locator, String[] items) {

            super(source, editorType, locator);

            this.items = items;

      }


      @Override

      protected void initCellEditor() {

            CCombo text = (CCombo) getCellEditor().getControl();

            HelloWorldModel model = (HelloWorldModel) getEditPart().getModel();

            text.setText(model.getText());

      }


      @Override

      protected CellEditor createCellEditorOn(Composite composite) {

            try {

                  Constructor constructor = ComboBoxCellEditor.class

                              .getConstructor(new Class[] { Composite.class,

                                          String[].class });

                  return (CellEditor) constructor.newInstance(new Object[] {

                              composite, items });

            } catch (Exception e) {

                  return null;

            }

      }


      @Override

      protected boolean isDirty() {

            return !((CCombo) getCellEditor().getControl()).getText().equals(

                        ((HelloWorldModel) getEditPart().getModel()).getText());

      }

}



后面两个追加的重写方法有点奇怪是吧?我也不知道为什么我需要重写这两个方法。

没有重写上面第一个方法时,编辑控件根本不出来。这是因为缺省的它会查询CellEditor中是否有一个带Composite对象参数的构造方法,如果没有,则返回null。所以如果不重写,总是返回null,因为ComboboxCellEditor没有这类的构造方法。

重写第二个方法是因为如果不重写,它总是认为isDirty()是false,所以在commit()方法里,就直接跳出了。

不知道是不是我有哪个地方理解不对造成这样的结果。不过暂时我们先这样用着。

2.HelloWorldEditPart。显然是需要修改performRequest()方法,就是修改编辑器类的类型,再在editManager里追加一个参数,如下:

      @Override

      public void performRequest(Request req) {

            if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {

                  HelloWorldDirectEditManager manager = new HelloWorldDirectEditManager(

                              this, ComboBoxCellEditor.class,

                              new HelloWorldCellEditorLocator((HelloWorldModel) getModel()),new String[]{"name1","name2"});

                  manager.show();

            }else{

                  super.performRequest(req);

            }

      }

3、修改HelloWorldCellEditorLocator类。有一点我们需要注意的是:ComboboxCellEditor里的控件是CCombo。所以不要弄错了。一开始我就写成了Combo。所以结果总是异常。这个类修改如下,其实就是把控件类型修改一下:

 

public class HelloWorldCellEditorLocator implements CellEditorLocator {

 

      private HelloWorldModel model;

 

      public HelloWorldCellEditorLocator(HelloWorldModel model) {

            super();

            this.model = model;

      }

 

      public void relocate(CellEditor celleditor) {

            CCombo text = (CCombo) celleditor.getControl();

            Rectangle constraints = model.getConstraints();

            text.setBounds(constraints.x, constraints.y, constraints.width,

                        constraints.height);

      }

}



public class HelloWorldDirectEditPolicy extends DirectEditPolicy {

 

      @Override

      protected Command getDirectEditCommand(DirectEditRequest request) {

            CCombo text = (CCombo) request.getCellEditor().getControl();

            DirectEditHelloWorldCommand command = new DirectEditHelloWorldCommand(

                        (HelloWorldModel) getHost().getModel(), text.getText().trim());

            return command;

      }

 

      @Override

      protected void showCurrentEditValue(DirectEditRequest request) {

      }

}

 最后我们的效果如下:

combo1combo2

             图:修改时                                                                                   修改后

 

 

分享到:
评论

相关推荐

    GEF理解系列三

    在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...

    GEF理解系列二

    【GEF理解系列二】是深入学习GEF框架的第二部分,主要讲解如何配置和初始化Editor,以及如何创建多层结构以支持添加多个图形。GEF(Graphical Editing Framework)是一个用于构建图形编辑器的开源框架,常用于开发...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF的基础概念和实现方法。 GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放...

    Eclipse插件开发:GEF入门系列宝典

    2. **GEF框架**: - GEF提供了图形编辑的基础组件,如模型、视图、控制器(MVC)架构。 - 它提供了一套图形工具,如绘图工具、选择工具和连接线工具。 - GEF支持命令模式,使得操作可以撤销/重做。 - 它还包含...

    GEF入门系列 pdf 格式资料

    **GEF入门系列 PDF 格式资料** GEF(Graphical Editing Framework)是Eclipse开源组织推出的一个图形编辑框架,主要用于构建可视化的图形编辑...在阅读过程中,建议结合实际编程实践,以便更好地理解和掌握GEF的精髓。

    GEF入门系列

    - 示例代码:Eclipse项目中包含多个GEF示例,是学习和理解GEF的好资料。 - 在线教程:互联网上有许多博客和教程,针对不同水平的学习者提供了丰富的教学内容。 通过这个GEF入门系列,你可以逐步掌握如何利用GEF...

    EMF_GEF_入门系列

    本入门系列旨在帮助初学者快速理解并掌握这两个强大的工具。 EMF是Eclipse项目的一部分,它提供了一种模型驱动的开发方式。EMF允许开发者创建、存储和操作数据模型,这些模型可以用来表示复杂的数据结构或业务逻辑...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...

    Eclipse插件开发--gef开发指南与入门系列宝典

    2. GEF的基本概念:深入理解模型、表示层、编辑器和控制器的概念。 3. 编辑器的生命周期:学习编辑器的创建、打开、保存和关闭过程。 4. 图形元素的定义:创建自定义的图形节点和连接线,定义它们的外观和行为。 5. ...

    GEF入门实例代码2《Eclipse插件开发》中实例

    这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在Eclipse插件开发中,GEF提供了一套强大的框架,使得开发者可以方便地构建出功能丰富的图形用户界面...

    GEF教程

    为了帮助读者更好地理解GEF框架的实际应用,作者提供了由简至繁的一系列示例项目。这些项目按序排列,从最简单的pt1开始,逐步添加新功能,最终形成一个具备DirectEdit、Palette等功能的图形编辑器。这种逐步递进的...

    GEF入门学习例子

    这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...

    简单gef框架

    4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...

    GEF 入门教程 中文版

    ### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。

    GEF基础知识

    - **Control(控制器)**:这部分主要是由一系列`EditPart`组成,它们是GEF的核心组件。每个`EditPart`都对应于模型中的某个元素,并负责处理用户交互。 #### 四、Draw2D的核心组件——LightweightSystem **...

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

    **3gef**可能是这个系列教程的一个特定版本或者阶段,强调了对GEF的三次迭代改进或深化理解。这可能涉及到更高级的功能,如图形的动态更新、自定义手势识别或者与其他Eclipse插件的集成。 **gef_eclipse**标签表明...

    eclipse_gef_example.rar

    这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...

    gef工程代码

    2. **反汇编和指令分析**:gef可以展示程序的反汇编代码,帮助理解执行流程,并能解析和操作寄存器。 3. **调试信息**:gef能够显示函数调用栈、线程状态、共享库信息等,便于追踪问题源头。 4. **性能分析**:gef...

Global site tag (gtag.js) - Google Analytics