Aexi(5)-Glyph的事件处理

2024-08-24 00:32
文章标签 事件处理 glyph aexi

本文主要是介绍Aexi(5)-Glyph的事件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         这次的博客主要实现这样一个功能,当点击文档中的某个点时,调整光标Caret的位置.

         那么到底如何实现这样的功能呢?刚开始的时候我们肯定先考虑比较直接一点的方法.先使用一个controller类来接收鼠标点击事件.在相应的处理方法中可以拿到鼠标点击的坐标.然后遍历所有的page,row,basicGlyph来获得鼠标点击的具体图元,然后再去做具体的处理.

         但是我写了一会之后,马上就否决了这个方案,因为这个方案需要在同一个事件处理函数处理的代码实在太多了,比如我们需要给caret设置frame.最直接的方法就是挨个遍历Glyph比较点击点和Glyph的frame,还要根据是偏左偏右来决定caret是放在左边还是右边.

         这是点击到了Glyph的情况,如果点击到了某一行的空白区域,就要把caret设置到最右边.如果点击了空行,则更加复杂,因为仅仅设置frame是不可以的,还是更改caret的文档索引,以便于用户在caret所在的位置插入文字.

         最最关键的是如果后期我们要对鼠标的点击事件做进一步扩充的话,那么这个函数就会无休止的变得臃肿,因此肯定要进行封装.把和每个图元相关的方法封装到图元自己的身上去.

         具体的设计是怎样的呢?首先我们给GlyphImpl类增加的一个函数public Boolean hitRect(x,y),传入一个坐标值,返回该坐标点是否落在本对象内.

具体函数实现代码如下:

public boolean hitRect(int x, int y) {Frame frame = getFrame();if (x > (frame.getX() + frame.getWidth()) || x < frame.getX())return false;return !(y > (frame.getY() + frame.getHeight()) || y < frame.getY());
}

整个文档结构是分层级的,每个层级的对象都应该有机会处理到点击事件,并且上层决定事件时候分发给下层,下层接受到事件之后,还要告诉上层是否已经处理完了,如果没有处理完应该由上层继续协助处理.

写到这里大家应该就非常清楚了,这样的设计就是借鉴了Android系统的事件处理机制.

         我们给Glyph添加如下的的几个方法:

@Override
public boolean dispatchClickEvent(MouseEvent e) {if (interceptClickEvent(e))return true;return onClickEvent(e);
}@Override
public boolean onClickEvent(MouseEvent e) {return false;
}@Override
public boolean interceptClickEvent(MouseEvent e) {return false;
}

这是GlyphImpl的默认实现,主要针对的是基本图元.从dispatchClickEvent()可以看出,首先询问了本类的interceptClickEvent函数是否截断该事件的传递,如果不截断,就发送给本类的onclickEvent()函数进行处理.

下面是GlyphImplGroup的默认实现,主要区别在于dispatchClickEvent()方法.

@Override
public boolean dispatchClickEvent(MouseEvent e) {if (interceptClickEvent(e))return true;List<GlyphImpl> children = getChildren();Glyph toBeHandledGlyph = null;for (GlyphImpl glyph : children) {if (glyph.hitRect(e.getX(), e.getY())) {toBeHandledGlyph = glyph;break;}}//toBeHandledGlyph可能为空if (toBeHandledGlyph == null)//进入这里就表示,点到空白位置了,这里需要区别对待,如果是row就要把caret放到row的最右边,如果是page就要把caret放到最后一行.//应该直接分发给本类对象的onClickEvent()方法return onClickEvent(e);if (!toBeHandledGlyph.dispatchClickEvent(e))return onClickEvent(e);return true;
}

从函数的具体实现可以看出,首先询问本类的interceptEvent()方法是否截断,如果不截断,就遍历子图元调用hitrect()方法找到具体击中的子图元.如果没有找到子图元就发送给本类的onclickEvent()方法.如果找到了就根据子图元的dispatch方法的返回值决定是否还要继续分发给本类onclickEvent();

这样就可以实现上层的对象通过intercept()函数进行控制是否发送事件给下层,下层通过onclickEvent()决定事件是否要抛给上层.

经过这样的设计,就使得复杂的点击事件处理变得简单了,当需要扩充时,可以根据具体的业务逻辑,找到对应的对象并在其onclickEvent()中进行处理了.





这篇关于Aexi(5)-Glyph的事件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100939

相关文章

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

Android触摸事件处理机制之requestDisallowInterceptTouchEvent

一、触摸事件传递的规则 当手指触摸到屏幕时,系统就会调用相应的View的onTouchEvent,并传入一系列的action。当有多个层级的View时,在父层级允许的情况下,这个action会一直向下传递直到遇到最深层的View。所以touch事件最先调用的是最底层View的onTouchEvent,如果View的onTouchEvent接收到某个touchaction并做了相应处理,最后有两种

java AWT事件处理

事件处理的过程中,主要涉及3类对象: Event Source(事件源):事件发生的声所,如按钮,窗口,菜单等组件。 Event(事件):事件封装了GUI组件上发生的特定事情(通常是一次用打操作)。 Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出响应处理。 实现AWT事件处理机制的步骤如下: 1.实现事件监听器类,该监听器类是一个特殊的java类

Flink进阶-Flink CEP(复杂事件处理)

0. 本文概述简介 FlinkCEP是在Flink之上实现的复杂事件处理(CEP)库。 它允许你在×××的事件流中检测事件模式,让你有机会掌握数据中重要的事项。 本文描述了Flink CEP中可用的API调用。 首先介绍Pattern API,它允许你指定要在流中检测的模式,然后介绍如何检测匹配事件序列并对其进行操作。 然后,我们将介绍CEP库在处理事件时间延迟时所做的假设。 1.入门 首先是要

IOS事件处理编程指南(一)——概要

在IOS设备中,我们能够处理多种事件。IOS将事件分为了如下三种:MultiTouch events,Motion events,和Remote control events。 被UIKit简化的事件处理 不用多说,UIKit框架为我们封装并实现了一些常用事件,同时,我们也可以通过重写touch系列响应函数,或为View添加系统定义好的或我们自定义的Gesture Recongize来处

Scala界面事件处理

示例代码: import scala.swing.SimpleSwingApplicationimport scala.swing.MainFrameimport scala.swing.Buttonimport scala.swing.Labelimport scala.swing.Orientationimport scala.swing.BoxPanelimpo

jQuery 事件处理 on()

说到jQuery的事件处理,不得不提jQuery中一个全能事件方法 $(select).on() 。在给元素添加事件中,貌似它无所不能。用过jQuery的你肯定用过该方法。 一说到事件,经常听人说,事件绑定,事件监听和事件委派。那么这三者的区别是什么呢?事件委派在本文章不做讲述,因为应用场景我还没有遇到过,下面用代码来讲解一下事件绑定和事件监听的区别 <!-- html --><input

【Qt 事件】—— 详解Qt事件处理

目录  (一)事件介绍  (二)事件的处理 (三)按键事件  3.1 单个按键 3.2 组合按键 (四)鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件  4.3 鼠标双击事件 4.4 鼠标移动事件  4.5 滚轮事件  (五) 定时器 5.1 QTimerEvent类 5.2 QTimer类 (六)事件分发器  6.1 概述 6.2 事件分发器工作原理 (

android开发点击事件处理机制简单介绍

android应用开发中经常会处理点击按键事件,那么当用户点击一个按钮后系统是怎么把点击事件分配给一个某控件处理的呢?        当用户点击一个按钮后系统处理顺序为Activity->Window->View既事件先传递给Actity在传给Window在传给View,View再经过三个阶段来处理该事件分别是事件分发、事件拦截、事件处理对应的方法是public boolean dispatch

Javaweb学习之Vue事件处理(六)

目录 前期回顾 认识事件处理 1. 事件监听 1.1. 基本用法 1.2. 事件对象 2. 事件修饰符   2.1事件修饰符 2.2. 使用场景 2.3. 自定义修饰符 3.事件处理函数 3.1定义事件处理函数 3.2绑定事件处理函数 3.3传递参数给事件处理函数 前期回顾 Javaweb学习之Vue数据绑定(五)-CSDN博客 认识事件处理 V