拖拽深度分析.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java dnd拖拽实现分析纪要 既有的Swing组件都内置了拖拽的支持,是怎么样支持呢? 首先,在Windows环境的jvm进程中,一个gui程序将启动两个线程:AWT-WINDOWS(AWT)和Event-Dispatch-Thread EDT 。AWT-WINDOWS线程不断从windows操作系统中获取GUI事件并进行初步的底层处理;其中一些事件会被包装成高级的AWTEvent置入一个地方,而EDT线程的处理过程就包括不断在的适当时机从这个地方获取这些AWTEvent并进行高级处理。 然后,拖拽的效果就是由以下几个GUI操作事件及相应程序处理完成的。 1. 拖拽开始,拖拽结束。 2. 拖拽进入(源组件/目的组件),拖拽经过(源组件/目的组件),拖拽离开(源组件/目的组件),拖拽中鼠标的移动。 3. 拖拽操作式样变换。即随键盘操作,可以指示3种操作式样:剪切式,复制式,链接式。 这些事件发生后,AWT线程即会获取到事件通知并处理,底层处理后会包装交给EDT继续处理。而处理的程序逻辑一般设计为,对于鼠标图标,会被设计为随拖拽的起始及移动的整个过程中不同事件的发生而发生变化(比如在dragover事件中可能根据当时情况将图标变为一个叉表示不能拖入);同时,对于拖拽源组件和目的组件,随不同的事件通知也会被程序设计为产生不同的变化响应(比如,拖拽结束的事件处理中可能指令目的组件复制源组件的文字内容),从而最终实现了拖拽的效果。 最后,看一些JRE7中拖拽的实现类。 Swing的JComponent组件将一些功能委托给其成员ComponentUI代理。比如JTextField在构造方法中即会通过UIManager获得合适的TextUI实例(UIManager将根据当前look and feel设置获取)(此后JTextField的paint方法会调用该UI实例的update方法从而完成组件绘画),并调用该UI实例的installUI方法(在installUI中则包括给JTextField对象安装一些监听器,安装TransferHandler这个支持拖拽的关键成员,它包含DragHandler,DropHandler两个内部类,而这两个内部类是实现拖拽效果的核心逻辑,安装droptarget)。 Swing将ui类划分在几个包中,其中javax.swing.plaf中存放一些接口;javax.swing.plaf.basic中存放对接口的基本实现,即多种LAF的通用实现;javax.swing.plaf.metal中存放java默认LAF实现;另外还有javax.swing.plaf.multi用来实现多个LAF的综合效果实现;javax.swing.plaf.synth用来实现可通过配置xml文件更换颜色等皮肤的实现。 对于拖拽方面,BasicUI在installUI中一般会对组件安装mouseListener: editor.addMouseListener dragListener ; editor.addMouseMotionListener dragListener ; 该dragListener将监听发生在组件上的鼠标事件,当发现可能是新启动的拖拽鼠标动作并且组件dragEnable时,则立刻通知DragRecognitionSupport单例进行组件拖拽识别。该support单例将辨别鼠标动作本身,确认是组件拖拽开始,再通知组件的TransferHandler成员对象进行拖拽初始化,即,经其辨别headless环境和action支持后将初始化建立并委托调用TransferHandler.SwingDragGestureRecognizer的全局单例 成员包括全局单例dragsource及draghandler对象 ,该实例注册拖拽识别listener及设置sourceAction,最终将通知TransferHandler.DragHandler对象的dragGestureRecognized。在该方法中,将创建transferable及初始化autoscroll;并通过dragSource全局单例完成创建DragContext,并获取及初始化DragContextPeer全局单例(给该单例注册上该component作为拖拽 trigger,以供native code可以在处理底层事件时,可以通过x,y判定是否contains,从而缩小事件处理范围),并通知DragContextPeer单例拖拽开始,而DragContextPeer单例则会调用底层native code进行进一步的处理。 此后AWT线程将通过windows-api获取到系统底层的各种拖拽事件并进行底层处理,处理过程将会随时引用DragContextPee

文档评论(0)

didala + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档