【飞秋】进一步完善 -- GEF创建助手工具条

GEF专题训练(一) RCP工程的创建1 在开始进入GEF开发前,我们需要先到官网下载GEF的一个插件,本人试着用以前没有安装该插件的eclipse开发时在创建RCP时会遇到无法创建的问题,当我换到下载的插件中去时,该问题就解决了,所以我们先从安装插件开始,一步步的进入GEF的世界吧。 首先登录到eclipse官网中的插件页面:https://www.eclipse.org/downloads/eclipse-packages/,下载E 阅读详情

昨天讨论了在图形元素上显示工具条的方法,应该说工作的还不是很完美,因为在选定了创建Connection的工具后,并不能像使用palette那样,在鼠标移动的过程中,有一个连接动态跟随,当鼠标释放后,如果释放位置在一个图形元素之上,那么将建立这个Connection,如果不在,那么这个连接将自动消失;今天想讨论一下如何实现这个功能;

我们知道GEF是以Draw2D的LightweightSystem作为实现的基础的,在LightweightSystm中对于mouseDown和mouseMove的实现如下:

事件发布
 1         /** @see MouseListener#mouseDoubleClick(MouseEvent) */
 2         public void mouseDoubleClick(MouseEvent e) {
 3             getEventDispatcher().dispatchMouseDoubleClicked(e);
 4         }
 5
 6         /** @see MouseListener#mouseDown(MouseEvent) */
 7         public void mouseDown(MouseEvent e) {
 8             getEventDispatcher().dispatchMousePressed(e);
 9         }
10
11         /** @see MouseTrackListener#mouseEnter(MouseEvent) */
12         public void mouseEnter(MouseEvent e) {
13             getEventDispatcher().dispatchMouseEntered(e);
14         }
15
16         /** @see MouseTrackListener#mouseExit(MouseEvent) */
17         public void mouseExit(MouseEvent e) {
18             getEventDispatcher().dispatchMouseExited(e);
19         }
20
21         /** @see MouseTrackListener#mouseHover(MouseEvent) */
22         public void mouseHover(MouseEvent e) {
23             getEventDispatcher().dispatchMouseHover(e);
24         }
25
26         /** @see MouseMoveListener#mouseMove(MouseEvent) */
27         public void mouseMove(MouseEvent e) {
28             getEventDispatcher().dispatchMouseMoved(e);
29         }
30
31         /** @see MouseListener#mouseUp(MouseEvent) */
32         public void mouseUp(MouseEvent e) {
33             getEventDispatcher().dispatchMouseReleased(e);
34         }
35
36         /** @see DisposeListener#widgetDisposed(DisposeEvent) */
37         public void widgetDisposed(DisposeEvent e) {
38             getUpdateManager().dispose();
39         }
40
由此可见,Draw2D对于鼠标事件的处理是由Event Dispacher进行派发的。那么这些派发的事件是怎么处理的呢?在org.eclipse.gef.tools.AbstractTool类中有很多相应的handleXXX方法,例如:handleDoubleClick、handleDrag方法等等,这就是处理这些鼠标事件的位置,当然这些方法在这个类中,没有做什么处理,仅仅返回了false;但是如果我们继续向下查找的话,会发现其子类AbstractConnectionCreationTool重写了一些handle方法,其中之一就是handleDrag,而handleDrag调用了handleMove;

handleXXX的实现
/**
     * @see org.eclipse.gef.tools.AbstractTool#handleDrag()
     */
    protected boolean handleDrag() {
        if (isInState(STATE_CONNECTION_STARTED))
            return handleMove();
        return false;
    }

    /**
     * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
     */
    protected boolean handleDragInProgress() {
        if (isInState(STATE_ACCESSIBLE_DRAG_IN_PROGRESS))
            return handleMove();
        return false;
    }

    /**
     * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
     */
    protected boolean handleFocusLost() {
        if (isInState(STATE_CONNECTION_STARTED)) {
            eraseSourceFeedback();
            eraseTargetFeedback();
            setState(STATE_INVALID);
            handleFinished();
        }
        return super.handleFocusLost();
    }

    /**
     * @see org.eclipse.gef.tools.TargetingTool#handleHover()
     */
    protected boolean handleHover() {
        if (isInState(STATE_CONNECTION_STARTED))
            updateAutoexposeHelper();
        return true;
    }

    /**
     * @see org.eclipse.gef.tools.TargetingTool#handleInvalidInput()
     */
    protected boolean handleInvalidInput() {
        eraseSourceFeedback();
        setConnectionSource(null);
        return super.handleInvalidInput();
    }

    /**
     * @see org.eclipse.gef.tools.AbstractTool#handleMove()
     */
    protected boolean handleMove() {
        if (isInState(STATE_CONNECTION_STARTED) && viewer != getCurrentViewer())
            return false;
        if (isInState(STATE_CONNECTION_STARTED | STATE_INITIAL
                | STATE_ACCESSIBLE_DRAG_IN_PROGRESS)) {
            updateTargetRequest();
            updateTargetUnderMouse();
            showSourceFeedback();
            showTargetFeedback();
            setCurrentCommand(getCommand());
        }
        return true;
    }
看到handleMove中的那个showSourceFeedback()方法了吧,其实我们今天讨论的问题,在GEF框架中就是通过它实现的;爬源码,我们可以知道这个方法事实上是调用了AbstractEditPart的showSourceFeedback()方法,而后者又调用了GraphicalNodeEditPolicy的showSourceFeedback方法,这个方法又调用了showCreationFeedback方法;


    /**
     * Shows feedback during a creation.
     *
     * @param request
     *            CreateConnectionRequest
     */
    protected void showCreationFeedback(CreateConnectionRequest request) {
        FeedbackHelper helper = getFeedbackHelper(request);
        Point p = new Point(request.getLocation());
        helper.update(getTargetConnectionAnchor(request), p);
    }

    /**
     * calls {@link #showCreationFeedback(CreateConnectionRequest)} when
     * appropriate.
     *
     * @see org.eclipse.gef.EditPolicy#showSourceFeedback(Request)
     */
    public void showSourceFeedback(Request request) {
        if (REQ_CONNECTION_END.equals(request.getType()))
            showCreationFeedback((CreateConnectionRequest) request);
    }

 

这下我们就明白了,我们只要照猫画虎,在我们的工具条的mouse move方法中实现上面的那个showCreationFeedback方法就行了;以下就是我们的实现:

 

 1 public void mouseDragged(MouseEvent me) {
 3     request = new CreateConnectionRequest();
 4     ScalableFreeformRootEditPart root = (ScalableFreeformRootEditPart) getSourceEditPart().getRoot();
 5     double zoom = root.getZoomManager().getZoom();
 6
 7     request.setLocation(new Point(hoverX * zoom, hoverY * zoom));
 8     request.setType("connection start");
 9
10     FeedbackHelper feedbackHelper = new FeedbackHelper();
11     Point p = new Point(me.x, me.y);
12     Connection connectionFeedback = FigureFactory.createNewWorkflowPath(null);
13
14     connectionFeedback.setConnectionRouter(((ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER)).getConnectionRouter());
15     connectionFeedback.setSourceAnchor(getSourceConnectionAnchor(request));
16     feedbackHelper.setConnection(connectionFeedback);
17
18     IFigure figure = getLayer(LayerConstants.FEEDBACK_LAYER);
19     for (int i = 0; i < figure.getChildren().size(); i++) {
20         if (figure.getChildren().get(i) instanceof Connection) {
21             figure.remove((IFigure) figure.getChildren().get(i));
22         }
23     }
24     getLayer(LayerConstants.FEEDBACK_LAYER).add(connectionFeedback);
25     request.setLocation(new Point(me.x * zoom, me.y * zoom));
26     feedbackHelper.update(null, new Point(me.x + offsetX * zoom, me.y + offsetY * zoom));
27 }
28
至此,我们的问题就解决了。但是还有一个问题,那就是,如果鼠标被释放了,那么这个被放置在反馈层的Connection应该被擦除掉,而同时还应该根据鼠标的位置决定是不是应该创建Connection;所以我们还应该再改一下mouse released方法,增加如下处理:
IFigure feedBackLayer = getLayer(LayerConstants.FEEDBACK_LAYER);
feedBackLayer.getChildren().clear();

通过以上的处理,我们就可以实现类似于palette中Connection Tool的功能了。当我们在一个图形元素上Hover时,首先程序先将与悬停位置最近的锚点作为源锚点,并显示工具条,当我们点击工具条上的Connection图标时,随着鼠标的拖动,一个Connection将动态跟随鼠标的移动被画出来,随着鼠标的释放,Connection将根据释放位置决定是否建立一个Connection,还是将这个动态的Connection清除掉;

关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

Eclipse GEF_01_HelloWorld 前提 可能有人会问RCP和GEF有什么关联? 首先,RCP是富客户端开发平台,RCP应用本质上就是一个可独立于Eclipse IDE开发环境运行的Eclipse插件。 而GEF,是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。 可以说RCP是搭建GEF的开发环境,而GEF是一个适用于RCP的框架。 这里要讲的 GEF 例子,还是从任何学习编程的最普通例子 Hel... 阅读详情

相关推荐

swt组件到GEF编辑器的拖动支持

       最近在项目中,需要完成从资源管理器(navigator)向GEF编辑器中拖放结点的功能。现总结个人体会如下(具体的实现流程,请参考http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html):1.       GEF封装了底层的SWT拖放。无需自己定义DragSource和DropTarget。2.       GEF的拖拽功能需要(1).一个可以注册在GEF 中GraphicalViewer上的监听器,该监听器需实现Trans

uestc_warlock的专栏 1379

飞秋实现的原理

(1)最关键的是局域网用户列表的建立;飞秋启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,默认端口是2425。广播包内容包含用户名、工作组、主机名、IP等信息; 已启动飞秋的用户通过2425端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表; (2)刷新用户列表时发送的广播包

北极光下 7175

飞秋-Windows下局域网内传输文件和文件夹的小工具

飞秋,Windows下局域网内传输文件和文件夹的小工具,非常方便,小巧易用,传输速度还很快,不需要任何设置即可实现局域网内文件传输,还支持直接传输文件夹。

针对局域网IM飞秋(feiq)的开发总结

先上代码了,通过java代码群发feiq消息: package com.triman.constant; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.DatagramPacket; import java.net.DatagramSoc...

weixin_30692143的博客 692

禁用飞秋的默认端口脚本

禁飞秋默认2425端口,win8和XP的都有。如果想禁其他的就自己该一下就好了。

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载

联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。

QQ17855069的博客 6541

GEF入门系列(六、添加菜单和工具条)

我发现一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住。不仅是因为用它做出的图形界面好看,更重要的是,UI中最复杂和细微的问题,在GEF的设计中无不被周到的考虑并以适当的模式解决,当你了解了这些,完全可以把这些解决方法加以转换,用来解决其他领域的设计问题。去年黄老大在一个GEF项目结束后,仍然没有放弃对它的继续研究,现在甚至利用业余时间开发了基于GEF的SWT/JFace增强软件包,Eclips

鲨鱼的专栏 4232

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3178

[Eclipse]GEF入门系列(六、添加菜单和工具条)

我发现一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住。不仅是因为用它做出的图形界面好看,更重要的是,UI中最复杂和细微的问题,在GEF的设计中无不被周到的考虑并以适当的模式解决,当你了解了这些,完全可以把这些解决方法加以转换,用来解决其他领域的设计问题。去年黄老大在一个GEF项目结束后,仍然没有放弃对它的继续研究,现在甚至利用业余时间开发了基于GEF的SWT/JFace增强软件包,E...

diaozhuo4700的博客 278

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3945

国密套件ECC-SM2-SM4-CBC-SM3和ECDHE-SM2-WITH-SM4-SM3

双方交换各自的公钥,最后A计算点(x1,y1) = d1Q2,B计算点(x2,y2) = d2Q1,由于椭圆曲线上是可以满足乘法交换和结合律,所以 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标是一样的,所以它是共享密钥,也就是会话密钥。4、客户端和服务端分别使用工作密钥,计算主密钥,客户端随机数,服务端随机数,字符串常量"key expansion",经PRF计算生成工作密钥。工作密钥包括加密密钥和校验密钥,具体密钥长度由选择的密码算法决定。客户端支持的压缩算法列表。

Java学习笔记 3784

进一步完善 -- GEF创建助手工具条

昨天讨论了在图形元素上显示工具条的方法,应该说工作的还不是很完美,因为在选定了创建Connection的工具后,并不能像使用palette那样,在鼠标移动的过程中,有一个连接动态跟随,当鼠标释放后,如果释放位置在一个图形元素之上,那么将建立这个Connection,如果不在,那么这个连接将自动消失;今天想讨论一下如何实现这个功能; 我们知道GEF是以Draw2D的LightweightSyste...

weixin_30337157的博客 119

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1544

GEF入门系列(二、GEF概述)

在前面的帖子已经提到,GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很多,例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化数据库结构设计工具等等。归结一下,可以发现它们在图形化编辑方面具有以下共同之处:提供一个编辑区域和一个工具条,用户在工具条里选择需要的工具,以拖

鲨鱼的专栏 2889

德国冯哈勃 Faulhaber2342L012空心杯减速电机带编码器

为了制作平衡车,我在淘宝上面买了一个 Faulhaber2342L012空心杯减速电机电机,具体参数如下: 一:电机参数 型    号:德国冯哈勃Faulhaber带编码器空心杯减速电机2342L012  12V每分 钟 120转 工作电压: 12V 空载转速:8100RPM(转每分钟) 减速后速:120RPM(转每分钟) 直     径:30mm

u011511430的专栏 1万+

Vivado新手避坑指南:搞懂Generate Output Products和Create HDL Wrapper到底在干啥

本文深入解析Vivado设计流程中的Generate Output Products和Create HDL Wrapper两大关键步骤,帮助新手理解其核心功能与操作要点。通过详细讲解文件生成类型、关键选项设置及常见问题解决方案,指导开发者正确使用这两个功能,避免设计流程中的常见错误,提高FPGA开发效率。

weixin_29207149的博客 313

[GEF循序渐进系列之三]Hello world with GEF

本文最初发表于http://eclipse.kuwww.net 原文引用http://my.kuwww.net/eclipse/blogview.asp?logID=5&cateID=4作者:齐好宗    hzqi@isoftstone.com下面我们要做一个最简单的GEF应用程序。在大部分经典的语言教程中,总是已HelloWorld命名第一个小程序,这里我们也以HelloWorld开始。我们所应

齐好宗(cycloneQI)的专栏 4048

基于YOLOv26的护栏损坏检测系统原理讲解

本文介绍了一种基于YOLOv26深度学习的护栏损坏检测系统。该系统通过车载摄像头或固定监控采集道路护栏图像,利用改进的YOLOv26算法实现高效准确的损坏检测。系统采用分层架构设计,包含数据采集、检测处理、分析评估和应用服务四个层次,能够自动识别变形、断裂、缺失等五种常见损坏类型,并评估损坏严重程度。相比传统人工检测方法,该系统大幅提高了检测效率和准确性,降低了人工成本和安全风险。关键技术包括多尺度特征融合、注意力机制和自适应非极大值抑制等创新设计,使系统在复杂道路环境下仍能保持稳定的检测性能。

一键难忘的博客 329

使用GEF创建数据库模型编辑器

用过Eclipse相关产品的人经常会看到一些涉及到图形应用的插件,比如Struts、UML、DatabaseDesign相关的插件;或者企业中自己要定制自己的图形化的工作流编辑器,组织结构图等。这些都涉及到图形编辑,以前我们大多用Win32API或JFC/Java2D技术自己做框架来实现这些功能,复杂且工作量大!GEF(Graphical EditorFramework)是现在Ec

Benson Wang 专栏 2808

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

palette gef_GEF走向3D

在模型驱动的开发领域,模型扮演着重要角色。 通常,模型是通过二维图可视化的,UML图可能是最突出的示例。 但是,在某些情况下,二维根本不够。 有时,模型需要三维表示,或者应同时显示多个二维图。 后一种情况可以可视化所谓的图间关系,即不同图的元素之间的连接。 GEF3D [2]框架允许以非常简单的方式创建三维图编辑器。 GEF3D已在作者的博士学位中作为一种工具启动。 项目,并且在2008年...

439

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GEF总结

    先介绍一下GEF要用到的设计模式.   在学GEF中给我感受最深的是,设计模式无处不在,除了上章中说的观察者模式外.GEF框架还运用了COMMAND(命令)模式,Policy(策略)模式.这两个模式,策略模式,貌似本团对有人介绍过了,而command模式是我现研究的(也许会单独写个随笔,谈谈心得).  好了,我们言归正传.先说一下,GEF控制器的实现原理.控制器是由一组EditPart对象共同组成的,每一个模型对象都对应一个EditPart对象。应用程序中需要有一个EditPartFactory对象

ssusriqpl_java的专栏 2127

GEF原理及实现系列(一、GEF概述)

GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。 本系列介绍GEF中的几个基本概念,包括如下部分: 1、GEF概述 2、模型(Model) 3、视图(View) 4、控制器(Control) 5、请求和编辑策略(Request and EditPolicies) 6、命令(commands

理工科的杜小甫的博客 4823

GEF 外部组件到GEF编辑器的拖动支持

最近在项目中,需要完成从资源管理器(navigator)向GEF编辑器中拖放结点的功能。 现总结个人体会如下(具体的实现流程,请参考http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html): GEF封装了底层的SWT拖放。无需自己定义DragSource和DropTarget。 GEF的拖拽功能需要 (1).一个可以注册在G

Hello Eclipse Plugin 黑夜 2640

Eclipse GEF_02_创建模型

概述 下面我们就要在这个 Diagram Editor 上画图了,因为我们要讲的是 GEF,所以要按 GEF 的路子走,即使看上去比较麻烦。什么是 GEF 的路子呢,可以看下面的图看了解一下。 ​​​​​​ 创建模型 首先我们创建最基本的模型,因为我们现在只想在 Diagram Editor 中显示 Hello World 就好,所以我们只有一个模型,我们把这个模型放在 gef.tutorial....

qq_29316291的博客 401

java gef_GEF简介

GEF(Graphical Editing Framework )是Eclipse旗下的强有力的Tool Project,利用GEF可以轻松实现类似于Visual Editor的可视化图形编辑应用程序。我将以如何构建一个数据库编辑工具为力,介绍一下GEF。1.什么是GEF。EditPartViewer上面已经说过了,GEF是Eclipse旗下的Tool Project,为开发者提供了一个图形编辑开...

weixin_32751907的博客 549
上一篇: 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。
下一篇: 【飞秋】存储过程与业务类实现业务的差异比较
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值