Feedback(反馈)详述一

本文介绍了GEF编辑器中Feedback机制的工作原理,包括Feedback的调用、创建及实现过程。详细阐述了从ActiveTool调用到EditPart创建,再到EditPolicy的具体实现,并解释了Feedback效果如何通过FeedbackLayer在编辑器中呈现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Feedback用于对gef编辑器操作的反馈,最常见的是一些鬼影效果。

 

 

1.Feedback的调用:

每个gef编辑器都有一个EditDomain对象,EditDomain主要是用于触发事件用的,这样说真的很不负责任。但是,事件的转发确实是它的主要责任之一。首先它会获取到事件源,然后获取到当前活动的ActiveTool,然后转发给当前活动的ActiveTool。至于事件是如何响应的,如何处理的,都是由Tool来处理的。(关于EditDomain和tool这块在另一篇文章里面有描述)

由于事件的响应都是由ActiveTool处理的,EditDomain只做转发,所以,最源头调用Feedback的地方是各个ActiveTool,这个获取一下引用就能够找到了,包括最终销毁Feedback效果也是在ActiveTool里面处理的。

 

 

2.Feedback的创建:

尽管调用是在ActiveTool里面,但是创建却是在EditPart里面,在EditPart接口里面定义了四个方法:

 

void eraseSourceFeedback(Request request);

void eraseTargetFeedback(Request request);

void showSourceFeedback(Request request);

void showTargetFeedback(Request request);
 

这还没完,我们可以看看AbstractEditPart里面对这些方法的实现,这里只贴出一个:

 

public void showSourceFeedback(Request request) {
		if (!isActive())
			return;
		EditPolicyIterator i = getEditPolicyIterator();
		while (i.hasNext())
			i.next().showSourceFeedback(request);
	}
 

从代码可以看出,其实gef的默认实现是调用EditPolicy里面的实现。现在就要弄清楚了,其实EditPart和EditPolicy里面都能够实现Feedback效果。具体在那里实现,完全看这个效果的粒度,如果它针对所有的请求都有效,可以直接在EditPart里面实现,如果只针对部分请求有效,就实现在EditPolicy里面。

 

 

3.Feedback的实现:

其最基本的实现原理是:在编辑器的根上有一个Feedback Layer,所有的与Feedback效果相关的IFigure,都是画在这个层上面的,所以一般打印是不会打印出Feedback的效果的。一个gef编辑器的最底层的容器是一个由多个层组成的IFigure,这个网上查一下就很清楚了。

 

一般我们需要获取图片的画,主要是获取打印Layer,然后通过对打印层的部分在内存中重画成一个image对象,然后保存到文件中,这个是打印层主要的用法。还有连线层,专门是放线的。Feedback专门用于显示反馈效果的。 

 

在GraphicalEditPolicy里面有一个addFeedback(IFigure figure)方法,把自己想显示的效果实现在这个地方,就能显示了。

 

protected void addFeedback(IFigure figure) {
		getFeedbackLayer().add(figure);
	}
 

具体的实现细节自己把握。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值