??xml version="1.0" encoding="utf-8" standalone="yes"?>色噜噜综合亚洲av中文无码,亚洲AV香蕉一区区二区三区,在线播放亚洲精品http://www.tkk7.com/baixch/archive/2008/11/18/GCReferenceFinalizeDispose.html英雄英雄Tue, 18 Nov 2008 06:50:00 GMThttp://www.tkk7.com/baixch/archive/2008/11/18/GCReferenceFinalizeDispose.htmlhttp://www.tkk7.com/baixch/comments/241146.htmlhttp://www.tkk7.com/baixch/archive/2008/11/18/GCReferenceFinalizeDispose.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/241146.htmlhttp://www.tkk7.com/baixch/services/trackbacks/241146.html阅读全文

英雄 2008-11-18 14:50 发表评论
]]>
JAVA InputMethod输入实现U要http://www.tkk7.com/baixch/archive/2008/11/14/240539.html英雄英雄Fri, 14 Nov 2008 07:15:00 GMThttp://www.tkk7.com/baixch/archive/2008/11/14/240539.htmlhttp://www.tkk7.com/baixch/comments/240539.htmlhttp://www.tkk7.com/baixch/archive/2008/11/14/240539.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/240539.htmlhttp://www.tkk7.com/baixch/services/trackbacks/240539.html阅读全文

英雄 2008-11-14 15:15 发表评论
]]>
JAVA MouseEvent实现U要http://www.tkk7.com/baixch/archive/2008/10/30/237557.html英雄英雄Thu, 30 Oct 2008 03:33:00 GMThttp://www.tkk7.com/baixch/archive/2008/10/30/237557.htmlhttp://www.tkk7.com/baixch/comments/237557.htmlhttp://www.tkk7.com/baixch/archive/2008/10/30/237557.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/237557.htmlhttp://www.tkk7.com/baixch/services/trackbacks/237557.html阅读全文

英雄 2008-10-30 11:33 发表评论
]]>
Java Focus实现U要?/title><link>http://www.tkk7.com/baixch/archive/2008/10/29/237408.html</link><dc:creator>英雄</dc:creator><author>英雄</author><pubDate>Wed, 29 Oct 2008 08:51:00 GMT</pubDate><guid>http://www.tkk7.com/baixch/archive/2008/10/29/237408.html</guid><wfw:comment>http://www.tkk7.com/baixch/comments/237408.html</wfw:comment><comments>http://www.tkk7.com/baixch/archive/2008/10/29/237408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/baixch/comments/commentRss/237408.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baixch/services/trackbacks/237408.html</trackback:ping><description><![CDATA[  <p style="text-align: center" align="center"><strong>Java Focus</strong><strong><span style="font-family: 宋体">实现U要?/span></strong></p> <p><span style="font-family: 宋体">特别注意Q按</span>java<span style="font-family: 宋体">l出?/span>Focus<span style="font-family: 宋体">实现规范Q?/span>jre1.7<span style="font-family: 宋体">保证实现如下几点Q?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; text-align: left" align="left">1.<span style="font: 7pt 'Times New Roman'">       </span>Focus_Gained,Focus_Lost<span style="font-family: 宋体">事g的序列。即如果?/span>EDT<span style="font-family: 宋体">中,应用E序查询</span>currentFocusOwner<span style="font-family: 宋体">Q?/span>=A<span style="font-family: 宋体">Q此?/span>=B<span style="font-family: 宋体">Q则中间一定按序收到</span>A Lost<span style="font-family: 宋体">Q?/span>B Gain.<span style="font-family: 宋体">q主要通过</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager.dispatchEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ӟ其是处?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Gained(PreparedFocusGained)</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ӟ如果发现</span>currentFocusOwner!=null<span style="font-family: 宋体">Q说明尚未得?/span>Lost<span style="font-family: 宋体">Q则会主动生成一?/span>Lost<span style="font-family: 宋体">发布Q处理后l箋处理</span>Gained<span style="font-family: 宋体">?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; text-align: left" align="left">2.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">如果是在同一个重量lg间做轻量U组仉切换Q每一?/span>focus event<span style="font-family: 宋体">实例上可以获取到准确?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">opposite</span><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">Q?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">source.</span><span style="font-family: 宋体">q主要通过</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager.dispatchEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.retargetEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ӟd控制U正可能的不准确?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">source,opposite</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; text-align: left" align="left">3.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Focus Event</span><span style="font-size: 10pt; color: black; font-family: 宋体">支持</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">temporary</span><span style="font-size: 10pt; color: black; font-family: 宋体">应用Q尤其体现在当整?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">window</span><span style="font-size: 10pt; color: black; font-family: 宋体">失去焦点Q当再次获取焦点时将恢复?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">window</span><span style="font-size: 10pt; color: black; font-family: 宋体">的最后聚焦组件。应用程序查?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focus event.isTemporary==true</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ӟ则可以确信该lg按既有逻辑很快恢复焦炏V?/span><span style="font-family: 宋体">q主要通过</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager.dispatchEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.retargetEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ӟ?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">temporary</span><span style="font-size: 10pt; color: black; font-family: 宋体">做了充分的考虑控制?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; text-align: left" align="left">4.<span style="font: 7pt 'Times New Roman'">       </span>KeyEvent<span style="font-family: 宋体">的处理符合规范流E:</span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">a.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">Ҏ</span>request<span style="font-family: 宋体">旉戳缓存?/span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">b.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">解除~存旉?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.<em>isProxyActive</em></span><em><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span></em><em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KEYEVENT</span></em><em><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span></em><span style="font-size: 10pt; color: black; font-family: 宋体">Q考虑是否交给本地pȝ代理处理?/span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">c.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 宋体">否则</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.</span><span style="font-size: 10pt; color: black; font-family: 宋体">注册</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">keyEventDispatchers</span><span style="font-size: 10pt; color: black; font-family: 宋体">接手处理?/span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">d.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">发布?/span>keyevent<span style="font-family: 宋体">l对?/span>component<span style="font-family: 宋体">q行处理Q其中分为如下阶D:</span></p> <p style="margin-left: 54pt; text-indent: -18pt; text-align: left" align="left">1.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Allow the Toolkit to pass this to AWTEventListeners.</span><span style="font-size: 10pt; color: black; font-family: 宋体">注册?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">toolkit</span><span style="font-size: 10pt; color: black; font-family: 宋体">下的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">AWTEventListeners</span><span style="font-size: 10pt; color: black; font-family: 宋体">得到处理?/span></p> <p style="margin-left: 54pt; text-indent: -18pt; text-align: left" align="left">2.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.processKeyEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">用来处理焦点遍历</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(TAB</span><span style="font-size: 10pt; color: black; font-family: 宋体">{?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 54pt; text-indent: -18pt; text-align: left" align="left">3.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Pre-process any special events before delivery</span><span style="font-size: 10pt; color: black; font-family: 宋体">。对</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KEY_PRESSED</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KEY_RELEASED</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q组件的容器有机?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">preProcessKeyEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 54pt; text-indent: -18pt; text-align: left" align="left">4.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 宋体">lg的对?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Key(Press,Typed,~~)Listener</span><span style="font-size: 10pt; color: black; font-family: 宋体">q行处理?/span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">e.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager.</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">keyEventPostProcessors</span><span style="font-size: 10pt; color: black; font-family: 宋体">接手处理?/span></p> <p style="margin-left: 36pt; text-indent: -18pt; text-align: left" align="left">f.<span style="font: 7pt 'Times New Roman'">        </span><span style="font-size: 10pt; color: black; font-family: 宋体">lg</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">peer</span><span style="font-size: 10pt; color: black; font-family: 宋体">得到Z处理?/span></p> <p><span style="font-family: 宋体">在其?/span>1<span style="font-family: 宋体">Q?/span>2<span style="font-family: 宋体">Q?/span>3<span style="font-family: 宋体">点的实现中,</span>Jre1.7<span style="font-family: 宋体">版本充分考虑了跨q_性:比如</span>Windows<span style="font-family: 宋体">pȝQ如果仅仅是拖动滚动条是不会发出</span>FocusEvent<span style="font-family: 宋体">Q而其他系l就会发?/span>temporary<span style="font-family: 宋体">?/span>FocusEvent<span style="font-family: 宋体">Q有些系l在重量U对{体间切换可以提供准的</span>opposite<span style="font-family: 宋体">Q但是有些系l则不提供。?/span>jre1.7<span style="font-family: 宋体">在实C融合了各个系l的情况Q给Z全面判断qҎ地处理Q保证了跨^台的</span>Focus<span style="font-family: 宋体">规范表现?/span></p> <img src ="http://www.tkk7.com/baixch/aggbug/237408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baixch/" target="_blank">英雄</a> 2008-10-29 16:51 <a href="http://www.tkk7.com/baixch/archive/2008/10/29/237408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Focus实现U要?/title><link>http://www.tkk7.com/baixch/archive/2008/10/26/236734.html</link><dc:creator>英雄</dc:creator><author>英雄</author><pubDate>Sun, 26 Oct 2008 09:20:00 GMT</pubDate><guid>http://www.tkk7.com/baixch/archive/2008/10/26/236734.html</guid><wfw:comment>http://www.tkk7.com/baixch/comments/236734.html</wfw:comment><comments>http://www.tkk7.com/baixch/archive/2008/10/26/236734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/baixch/comments/commentRss/236734.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/baixch/services/trackbacks/236734.html</trackback:ping><description><![CDATA[  <p style="text-align: center" align="center"><strong>Java Focus</strong><strong><span style="font-family: 宋体">实现U要?/span></strong></p> <p style="margin-left: 18pt; text-indent: -18pt">1.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-family: 宋体">?/span>Jre1.7<span style="font-family: 宋体">版本中,</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager</span><span style="font-size: 10pt; color: black; font-family: 宋体">q两个类</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Component, WComponentPeer</span><span style="font-size: 10pt; color: black; font-family: 宋体">cM起完成了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 10pt; color: black; font-family: 宋体">的主要逻辑实现?/span></p> <p style="margin-left: 20.05pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager</span><span style="font-size: 10pt; color: black; font-family: 宋体">是前者的pȝ默认实现。其单例注册?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">appcontext</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,</span><span style="font-size: 10pt; color: black; font-family: 宋体">如果需要,E序员可以替代它Q以扩展</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 10pt; color: black; font-family: 宋体">的逻辑实现?/span></p> <p style="text-indent: 20pt"><span style="font-size: 8pt; color: black; font-family: 'Courier New'">appcontext.put(KeyboardFocusManager.</span><strong><span style="font-size: 8pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 8pt; color: black; font-family: 'Courier New'">, new SelfKeyboardFocusManager());</span></p> <p style="margin-left: 18pt; text-indent: -18pt">2.<span style="font: 7pt 'Times New Roman'">       </span>Component<span style="font-family: 宋体">中提供了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ҏ。而各个组件在初始化时都会安装默认?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Listener</span><span style="font-size: 10pt; color: black; font-family: 宋体">。当q些</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Listener</span><span style="font-size: 10pt; color: black; font-family: 宋体">收到适当的事仉知后(比如</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">mouse_press</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q即会调用这个方法。该Ҏ首先判断该组件是?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focusable</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q组件所依托H口是否</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focusable</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q当前聚焦组件的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">InputVerifier</span><span style="font-size: 10pt; color: black; font-family: 宋体">是否验收输入{等Q判断通过后请求重量lg容器?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">peer.requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">WComponentPeer</span><span style="font-size: 10pt; color: black; font-family: 宋体">中提供该</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ҏ。该Ҏ首先调用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">native </span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">processSynchronousLightweightTransfer</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q其会调?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManage</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">r .processSynchronousLightweightTransfe</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q作用是如果当前</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 10pt; color: black; font-family: 宋体">lg的重量lg容器正对应当前底层系l的聚焦lgQ而且当前没有M切换焦点?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequests</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q这时将直接切换</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 10pt; color: black; font-family: 宋体">变量</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">.focusOwner</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-family: 宋体">如果上述调用没有利完成q返?/span>true<span style="font-family: 宋体">Q则会调?/span>native _requestFoucs<span style="font-family: 宋体">。该Ҏ会调?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManage</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">r .</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">shouldNativelyFocusHeavyweight</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q其作用是完成</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 10pt; color: black; font-family: 宋体">登记Qƈ?/span><span style="font-size: 10pt; color: black; font-family: 宋体">登记旉戳以正确~存处理后箋q入</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Keyevent</span><span style="font-size: 10pt; color: black; font-family: 宋体">处理?/span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Request</span><span style="font-size: 10pt; color: black; font-family: 宋体">登记的结构ؓ</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">.heavyweightRequests=</span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">LinkedList< HeavyweightFocusRequest > </span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">-- HeavyweightFocusRequest{</span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Component </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweight</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p> <p style="margin-left: 17.85pt; text-indent: 0cm; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">LinkedList<LightweightFocusRequest> </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">lightweightRequests</span><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">Q?/span><span style="font-size: 10pt; color: black; font-family: 宋体">登记方式分ؓ</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; font-family: 宋体">U?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">:</span></p> <p style="margin-left: 43.1pt; text-indent: -18pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">a. </span><span style="font-size: 10pt; color: black; font-family: 宋体">如果发出</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">的组件的重量U组件容器正对应当前底层pȝ的聚焦组Ӟ而且当前没有M切换焦点?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,</span><span style="font-size: 10pt; color: black; font-family: 宋体">则增加一?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">q向</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Post-Qqeue post focus-event</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 43.1pt; text-indent: -18pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">b. </span><span style="font-size: 10pt; color: black; font-family: 宋体">如果发出</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">lg的重量lg容器不对应当前底层系l的聚焦lgQ而且当前没有M切换焦点?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q或?/span><span style="font-size: 10pt; color: black; font-family: 宋体">当前存在切换焦点?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q而最后一?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'"> Heavyweight!=</span><span style="font-size: 10pt; color: black; font-family: 宋体">当前</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 10pt; color: black; font-family: 宋体">lg的重量lg容器Q则?/span><span style="font-size: 10pt; color: black; font-family: 宋体">增加一?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">Qƈ同步通知底层pȝq行重量U对{组件的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 10pt; color: black; font-family: 宋体">切换</span><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">?/span></p> <p style="margin-left: 43.1pt; text-indent: -18pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">c. </span><span style="font-size: 10pt; color: black; font-family: 宋体">如果当前存在切换焦点?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q而且最后一?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'"> Heavyweight==</span><span style="font-size: 10pt; color: black; font-family: 宋体">当前</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 10pt; color: black; font-family: 宋体">的组件的重量U组件容器,则直接在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">request.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">lightweightRequests</span><span style="font-size: 10pt; color: black; font-family: 宋体">q加一?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">LightweightFocusRequest</span><span style="font-size: 10pt; color: black; font-family: 宋体">?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; text-align: left" align="left">3.<span style="font: 7pt 'Times New Roman'">       </span><span style="color: black">EDT</span><span style="color: black; font-family: 宋体">在逐个处理</span><span style="color: black">AWTEvent</span><span style="color: black; font-family: 宋体">Ӟ委托l?/span><span style="color: black">EventQueue.</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dispatchEvent</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q而委托给</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Component. dispatchEventImpl,</span><span style="font-size: 10pt; color: black; font-family: 宋体">该方法顺序执行下面的代码片段Q?/span></p> <p style="margin-left: 18pt; text-indent: 12pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 宋体">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·</span></p> <p style="margin-left: 45.15pt; text-indent: -4.5pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 9pt; color: #3f7f5f; font-family: 'Courier New'">/*</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'"> focusManagerIsDispatching</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">标志了该</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">event;</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">如果</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">==true</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">意味着?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">event</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">不会交由</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">KeyboardManager</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">q行</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">retarget</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">dispatch</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">。而这两个动作主要完成的功能就是刷?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">java</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">的全局</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">focus</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">变量。因此可以想?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">focusManagerIsDispatching==true</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">Focus_event</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">focus</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">发生切换后的</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">event</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">Q?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">focusManagerIsDispatching==false</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">的是</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">PrepareFocusEvent</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">?/span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">*/</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><strong><span style="font-size: 6.5pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'"> (!e.</span><span style="font-size: 6.5pt; color: #0000c0; font-family: 'Courier New'">focusManagerIsDispatching</span><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">) {//----------</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">PrepareFocusEvent</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 6.5pt; color: #3f7f5f; font-family: 'Courier New'">// Invoke the private focus retargeting method which provides</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 6.5pt; color: #3f7f5f; font-family: 'Courier New'">// lightweight Component supportF</span></p> <p style="margin-left: 48.75pt; text-indent: -48.75pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 9pt; color: #3f7f5f; font-family: 'Courier New'">/*</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">通过</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">retargetFocus</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">Q处理之前注册的</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">request</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">hQ最l激发出合适的</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">CausedFocusEvent</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">Q交l下面的</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">dispatch.</span></p> <p style="text-indent: 36pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'"> */</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><strong><span style="font-size: 6.5pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'"> (e.</span><span style="font-size: 6.5pt; color: #0000c0; font-family: 'Courier New'">isPosted</span><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">) {</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">                e = KeyboardFocusManager.<em>retargetFocusEvent</em>(e);</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">                e.</span><span style="font-size: 6.5pt; color: #0000c0; font-family: 'Courier New'">isPosted</span><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'"> = </span><strong><span style="font-size: 6.5pt; color: #7f0055; font-family: 'Courier New'">true</span></strong><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">;</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            }</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 6.5pt; color: #3f7f5f; font-family: 'Courier New'">// Now, with the event properly targeted to a lightweight</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 6.5pt; color: #3f7f5f; font-family: 'Courier New'">// descendant if necessary, invoke the public focus retargeting</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><span style="font-size: 6.5pt; color: #3f7f5f; font-family: 'Courier New'">// and dispatching function</span></p> <p style="margin-left: 67.65pt; text-indent: -27pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 9pt; color: #3f7f5f; font-family: 'Courier New'">/*</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">通过</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">dispatch</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">l注册的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DefaultKeyboardFocusManager</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">,</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">最l更C</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">java</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">的全局</span><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'">focus</span><span style="font-size: 9pt; color: #0000c0; font-family: 宋体">变量</span></p> <p style="text-indent: 36pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 9pt; color: #0000c0; font-family: 'Courier New'"> */</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            </span><strong><span style="font-size: 6.5pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'"> (KeyboardFocusManager.<em>getCurrentKeyboardFocusManager</em>().</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">                dispatchEvent(e))</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            {</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">                </span><strong><span style="font-size: 6.5pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">;</span></p> <p style="line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">            }</span></p> <p style="margin-left: 18pt; text-indent: 0cm; line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">        }</span></p> <p style="margin-left: 18pt; text-indent: 12pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 6.5pt; color: black; font-family: 宋体">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·</span></p> <p style="margin-left: 18pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left">4.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 9pt; color: black; font-family: 宋体">MQ?/span></p> <p style="margin-left: 33pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: 'Courier New'">a. </span><span style="font-size: 8pt; color: black; font-family: 宋体">轻量U组件的</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Mouse_Press Listener</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">通过必要条g查后会在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">.heavyweightRequests</span><span style="font-size: 8pt; color: black; font-family: 宋体">~存列表登记Q同时在一个列表中登记一个时间戳</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">marker=</span><span style="font-size: 8pt; color: black; font-family: 宋体">当前pȝ旉?/span></p> <p style="margin-left: 33pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: 'Courier New'">b. </span><span style="font-size: 8pt; color: black; font-family: 宋体">每一?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">都有一个发生时?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">when</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q这个发生时间认为是</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">AWT-Windows loop</span><span style="font-size: 8pt; color: black; font-family: 宋体">底层</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">event</span><span style="font-size: 8pt; color: black; font-family: 宋体">形成</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">的时间?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">在调?/span><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">KeyboardFocusManager </span><span style="font-size: 6.5pt; color: black; font-family: 宋体">?/span><span style="font-size: 6.5pt; color: black; font-family: 'Courier New'">dispatchEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">处理一?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">时只要发?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">when</span><span style="font-size: 8pt; color: black; font-family: 宋体">晚于旉戳缓存列表中登记的第一个时间戳Q就充分说明q是在某焦点切换h发出后发生的键盘事gQ则不应该将q个</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent target</span><span style="font-size: 8pt; color: black; font-family: 宋体">到当前全局</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 8pt; color: black; font-family: 宋体">变量Q因而这时暂此</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">~存在另一个列表?/span></p> <p style="margin-left: 33pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: 'Courier New'">c. </span><span style="font-size: 8pt; color: black; font-family: 宋体">Ҏ前面的分析,?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 8pt; color: black; font-family: 宋体">时有</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 8pt; color: black; font-family: 宋体">U情况,一U是新增</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q同?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">post</span><span style="font-size: 8pt; color: black; font-family: 宋体">l?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">post-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">一?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">FocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q一U是新增</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q同时因求底层系l切换重量对等体?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">awt-loop</span><span style="font-size: 8pt; color: black; font-family: 宋体">C?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">FocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q这两种情况?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">都在列表中期待对?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">FocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">到来再切换焦炏V从登记旉戛_始,?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">awt-loop</span><span style="font-size: 8pt; color: black; font-family: 宋体">到的</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">q入</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">旉缓存下来,而一D|间后当期待的</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">FocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">post-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">q入</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">event-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">q要?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">中处理时Q有充分的条件可以判断出此后再进?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q都臛_?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">登记旉戛_发生的,则这时可以完成此</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request-</span><span style="font-size: 8pt; color: black; font-family: 宋体">删除?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">~存条目Q做</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 8pt; color: black; font-family: 宋体">实际切换Qƈ缓存的</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent </span><span style="font-size: 8pt; color: black; font-family: 宋体">及时间戳记录处理掉。而第</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 8pt; color: black; font-family: 宋体">U情冉|?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 8pt; color: black; font-family: 宋体">时可以在最末一?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">上直接追?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">LightWeightReuquest</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q那么当?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">heavyweightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">期待?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">FocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">到来Ӟ按前面所q处理完?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request,</span><span style="font-size: 8pt; color: black; font-family: 宋体">再将后箋</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">LightWeightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">保存引用C个全局变量</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">.currentLightweightRequests,</span><span style="font-size: 8pt; color: black; font-family: 宋体">再将此刻为止</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">awt-loop</span><span style="font-size: 8pt; color: black; font-family: 宋体">至的</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">post-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">的所?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">event</span><span style="font-size: 8pt; color: black; font-family: 宋体">完全</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">flush</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">event-queue,</span><span style="font-size: 8pt; color: black; font-family: 宋体">再把一个要求@环处理所?/span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentLightweightRequests</span><span style="font-size: 8pt; color: black; font-family: 宋体">指向?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">LightWeightRequests</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">InvocationEvent post </span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">event-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">之后。这样当</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">开始处理该</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">InvocationEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">Ӟ有充分的条g可以判断出此后再q入</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q都臛_是最后一个后l?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">LightWeightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">登记旉戛_发生的,则这时只需按该</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">InvocationEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">执行卛_Q及逐个清理</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">LightWeightRequest</span><span style="font-size: 8pt; color: black; font-family: 宋体">完成</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">focus</span><span style="font-size: 8pt; color: black; font-family: 宋体">切换及处理时间戳和缓?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">KeyEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">。如果在循环处理q程中发生对某一个组?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 8pt; color: black; font-family: 宋体">调用Q这时会Ҏ处理之初</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentLightweightRequests</span><span style="font-size: 8pt; color: black; font-family: 宋体">中是否只有单?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">来确定能?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">processSynchronousLightweightTransfe</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span><span style="font-size: 8pt; color: black; font-family: 宋体">卛_果有多个Q则q时止</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">processSynchronousLightweightTransfe</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">r</span><span style="font-size: 8pt; color: black; font-family: 宋体">以防止破坏了切换焦点的顺序?/span></p> <p style="margin-left: 33pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left"><span style="font-size: 8pt; color: black; font-family: 'Courier New'">d. </span><span style="font-size: 8pt; color: black; font-family: 宋体">重量U组件不需要在</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Mouse_Press Listener request Focus</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q当被进?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Mouse Press</span><span style="font-size: 8pt; color: black; font-family: 宋体">Ӟ底层pȝ分发一?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Focus Event</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q当q入</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">EDT</span><span style="font-size: 8pt; color: black; font-family: 宋体">处理Ӟ?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">jre1.7</span><span style="font-size: 8pt; color: black; font-family: 宋体">中通过</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">KeyboardFocusManager</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">retargetUnexpectedFocusEventretarget</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span><span style="font-size: 8pt; color: black; font-family: 宋体">首先逐个剔除</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">后进行期待匹?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 8pt; color: black; font-family: 宋体">针对可能的底层分?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">-post-queue-event-queue</span><span style="font-size: 8pt; color: black; font-family: 宋体">中间环节</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Event</span><span style="font-size: 8pt; color: black; font-family: 宋体">的遗漏等例外情Ş</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 8pt; color: black; font-family: 宋体">Q如果最后没有一?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">request</span><span style="font-size: 8pt; color: black; font-family: 宋体">匚wQ则直接形成</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">CausedFocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">交给后</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">dispatch</span><span style="font-size: 8pt; color: black; font-family: 宋体">完成焦点切换。更切地说Q对?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">jre1.7</span><span style="font-size: 8pt; color: black; font-family: 宋体">而言lg聚焦应该都通过</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">requestFocus</span><span style="font-size: 8pt; color: black; font-family: 宋体">完成切换Q不通过该方式的聚焦切换?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">retarget</span><span style="font-size: 8pt; color: black; font-family: 宋体">时将归属?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">Unexpected</span><span style="font-size: 8pt; color: black; font-family: 宋体">被处理,而重量lg的这U聚焦正好通过</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">unexpected</span><span style="font-size: 8pt; color: black; font-family: 宋体">完成?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; line-height: 10pt; text-align: left" align="left">5.<span style="font: 7pt 'Times New Roman'">       </span><span style="font-size: 8pt; color: black; font-family: 宋体">最后,个h认ؓ</span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">jre1.7</span><span style="font-size: 8pt; color: black; font-family: 宋体">中存在一个可能的问题Q每?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dispatchEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">旉会在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">retargetFocusEvent</span><span style="font-size: 8pt; color: black; font-family: 宋体">?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">processCurrentLightweightRequests</span><span style="font-size: 10pt; color: black; font-family: 宋体">Q?/span><span style="font-size: 8pt; color: black; font-family: 宋体">q样不久破坏?/span><span style="font-size: 8pt; color: black; font-family: 'Courier New'">4-c</span><span style="font-size: 8pt; color: black; font-family: 宋体">分析的时机逻辑了么Qؓ什么要q样呢?</span></p> <img src ="http://www.tkk7.com/baixch/aggbug/236734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/baixch/" target="_blank">英雄</a> 2008-10-26 17:20 <a href="http://www.tkk7.com/baixch/archive/2008/10/26/236734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Focus实现U要一http://www.tkk7.com/baixch/archive/2008/10/21/235614.html英雄英雄Tue, 21 Oct 2008 03:08:00 GMThttp://www.tkk7.com/baixch/archive/2008/10/21/235614.htmlhttp://www.tkk7.com/baixch/comments/235614.htmlhttp://www.tkk7.com/baixch/archive/2008/10/21/235614.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/235614.htmlhttp://www.tkk7.com/baixch/services/trackbacks/235614.html 

Java Focus实现U要一

H口pȝ一般包含一个桌?/span>GUI+若干应用E序GUI。每?/span>GUI都由lg构成Q每个组仉可以获得focusQ获?/span>focus的组件将获得之后的键盘事Ӟ而Q意时d有一个组件能获得focus。这个设计适用在当前所有的H口pȝQ而跨各种pȝ?/span>JAVA应用Q其focus的表C要遵循这个设计目标?/span>

JAVA的组件分为重量和轻量lgQ区别在于重量lg实例的成?/span>peer-对等体,其行为紧密依托本地系l的GUI行ؓ函数库来q行实现。比如一?/span>JFRAMEQ当setvisibleӞ会依?/span>peer.showq行屏幕l制行ؓQ该行ؓ会通过本地pȝGUI行ؓ函数库完成;q样一来,当其被点LQ本地系l会依据最初调用本?/span>GUI函数l制时留下的信息Q从而能够经底层处理后(比如该鼠标事g附加peer标记信息Q同时可能经底层分析需要构造出一个可能的focus_gain事gQ则在操作系l层面登记当前聚?/span>GUIlg{)准确底?/span>GUI事gzN给?/span>JVMq程Q该事g因而在jvmq程中的AWT-WindowsU程loop获取刎ͼq过事g提供?/span>peer标记最l确定目标ؓ重量U组?/span>JFRAMEQ因此一?/span>source==JFRAME?/span>AWTEvent被构造出来ƈ最l分zEDTq行后箋处理?/span>

事g机制是程序中家喻h的设计模式了。但是,?/span>java?/span>focus实现中对q个机制g多少有些不那么绝对的清晰J?/span>

个h理解Q事件的含义是某种定义的情况发生了。比如点击鼠标这个动作可以说触发了多个事Ӟ?/span>press,release,click{,分别指发生了鼠标button1按下Q放开Q完成点ȝ情况?/span>button1按下q个事g比v完成点击p更基一些,因ؓ完成点击指的是一个由按下Q放开动作序列l合的情况发生了?/span>

那么对于focusQ?/span>focus_gained,focus_lostq两个事件应该是指某lg获得焦点或失ȝ点的情况发生了,反映在机器里Q应该是某种指向当前聚焦lg的全局变量发生了更新?/span>

然而在Java awt实现里,概念混ؕ出现啦?/span>

如果awt_windows loop Cfocus事gQ一Q这个事件一定是目标向重量lg的;二,此时Q这个事件对于底层系l的对等lgQ?/span>focus_gainded是发生了(底层pȝ标记当前聚焦lg的全局变量已经更新Q底层操作系l没?/span>mess,L在真?/span>focus改变后才分发focus事g)Q然而在java层面Q截臛_awt_windows loop 到底?/span>focus事gq包装成FocusEvent攄?/span>EVENT QUEUEӞjava层面q没有更?/span>jvm里的全局变量。所以我个h认ؓq个时候就不应该包装成FocusEventQ至不应该叫这个名字,应该?/span>PrepareFocusEvent,嘿嘿?/span>

澄清事g机制的概念后Q回头看java focus 要实现的目标?/span>

1.       最单的设计思\是提供一?/span>setfocus调用APIQ该API来更C个全局变量?/span>EDT每次处理一?/span>keyevent根据当前全局变量q行target。最后给各类lg注册合适的事g监听Q比?/span>mouse press listenerQ在listen响应处理中调?/span>setfocus?/span>

要提?/span>setfocus指定某组件聚焦?/span>Setfocus一旦成功返回,该组件将接受后发生的所有的键盘事gQ直到再ơ失ȝ炏V?/span>

然而问题是轻量U组件的容器是一个重量lgQ而在对轻量lg调用setfocus时它的本地对{组件在pȝ中很可能q没有获得焦炏V若实现上只是简单的?/span>java的全局变量更新了,那系l就会出C个聚焦组Ӟ一个是底层pȝ承认的原来的某底层对{组Ӟ一个是java里认为的现在?/span>jtextfield。而本地系l始l把键盘事gz֏到它认可的聚焦组件上Q如果这个聚焦组件属于另外一?/span>C++q程Q那么这些键盘事件就会分发给C++q程Q而不会被JVM?/span>awt-windows loop到。也是_虽然setfocus成功q回了,但ƈ不代表随后的键盘事g?/span>target到这个组件上。所以不能采用这L设计思\?/span>

管如此Q实际上我们的组件的监听一般是?/span>mouse_press上。而这个鼠标按下动作各cd层操作系l处理时一般首先分?/span>mouse_press底层事gQ然后切换焦点,再分?/span>focus事g。随后的键盘事g会在底层切换焦点后分发出厅R假如我们确定下来所?/span>GUI应用只在EDTU程?/span>mouse_press监听处理?/span>setfocusQ实际上不会丢失键盘事g。但是如果我们要在其他情况,比如?/span>worker U程?/span>setfocusQ那?/span>setfocus׃再可靠了?/span>

那么Q根据前面的分析Q现在更改设计,?/span>setfocus处理中调用底?/span>API要求光量容器对应的本地对{组件聚焦ƈ{到它确实聚焦完成了再更?/span>JAVA的全局变量。但q样也有问题。即使底层系l根据底层调用通知更新?/span>focus,马上q会l箋对可能的焦点切换操作响应Q可以认为有一个系l进E在处理外设的响应)Q很有可能别?/span>C++应用在此时再要?/span>focusQ于是接着更C底层?/span>focus登记Q而我们的setfocus调用却是?/span>jvmq程的某U程中,昄q就是个q发的情景,q样Q很有可能我们的Ҏ地对{组件的通知发过dƈq回了,那边底层pȝ马上切换到?/span>C++的某个组?/span>focusQ而我们的U程l箋更新JAVA的全局focus变量Q于是虽?/span>setfocus成功q回了,但ƈ不代表随后的键盘事g?/span>target到这个组件上?/span>

现在看来Q除非我们同步这两个q程Q让pȝq程{待我们的调?/span>setfocus的线E返回,昄那样是不合理的?/span>(JAVA只能服从OSQ不能让OS服从JAVA?/span>---《英雄ؕ语?/span>J)?/span>

鉴于以上的分析,Ҏ无法实现一?/span>setfocus来完成一个切换焦点的原子性操作?/span>jre1.7的实Cؓ不存?/span>setfocusQ而只?/span>requestfocusQ意思是只是这个切换焦点的h登记上但q不q行实际切换focusQ随后等收到相应的事仉知后再处理requestq彻底完成一?/span>focus切换?/span>

2.       聚焦lg后马上获得随后的键盘事g?/span>

隄是按用户的实际想法,mouse_press后,马上p键盘拼写Q键盘的输入应该target?/span>mouse_press?/span>jtextfield。根据前面的分析Q?/span>mouse_press响应?/span>requestfocus/setfocus后ƈ没有意味着切换焦点已经完成。若实现上对于后l的键盘事g只是单地ҎJAVA的那个全局focus变量targetQ则q些键盘事g不?/span>target到期待的lg上?/span>

鉴于以上的分析,jre1.7的实现是requestfocusӞ只要q个h满必要条gQ那么在其返回前qC个时间戳Q在q个旉戳之后在下一?/span>requestfocus旉戳之前,EDT 逐个取的keyevent都将target到该lgq登讎ͼ直到该组件彻底聚焦完成后Q马上把q些keyevent dispatch?/span>

3.       需要支?/span>TAB键等焦点遍历操作?/span>

q一?/span>JAVA有一个遍历模型,如下Q?/span>

具体参照http://java.sun.com/javase/6/docs/api/java/awt/doc-files/FocusSpec.html

该要 求ƈ没有隄。实C只要?/span>keyevent监听QƈҎ规则q行合适处理即可?/span>



英雄 2008-10-21 11:08 发表评论
]]>
Java dnd拖拽实现分析U要http://www.tkk7.com/baixch/archive/2008/10/10/233575.html英雄英雄Fri, 10 Oct 2008 05:37:00 GMThttp://www.tkk7.com/baixch/archive/2008/10/10/233575.htmlhttp://www.tkk7.com/baixch/comments/233575.htmlhttp://www.tkk7.com/baixch/archive/2008/10/10/233575.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/233575.htmlhttp://www.tkk7.com/baixch/services/trackbacks/233575.html 

Java dnd拖拽实现分析U要

既有?/span>Swinglg都内|了拖拽的支持,是怎么h持呢Q?/span>

首先Q在Windows环境?/span>jvmq程中,一?/span>guiE序启动两个线E:AWT-WINDOWSQ?/span>AWTQ和Event-Dispatch-Thread(EDT)?/span>AWT-WINDOWSU程不断?/span>windows操作pȝ中获?/span>GUI事gq进行初步的底层处理Q其中一些事件会被包装成高?/span>AWTEvent|入一个地方,?/span>EDTU程的处理过E就包括不断在的适当时机从这个地方获取这?/span>AWTEventq进行高U处理?/span>

然后Q拖拽的效果是׃下几?/span>GUI操作事g及相应程序处理完成的?/span>

1.       拖拽开?/span>,拖拽l束?/span>

2.       拖拽q入Q源lg/目的lgQ,拖拽l过Q源lg/目的lgQ,拖拽dQ源lg/目的lgQ,拖拽中鼠标的Ud?/span>

3.       拖拽操作式样变换。即随键盘操作,可以指示3U操作式P剪切式,复制式,链接式?/span>

q些事g发生后,AWTU程即会获取C仉知q处理,底层处理后会包装交给EDTl箋处理。而处理的E序逻辑一般设计ؓQ对于鼠标图标,会被设计为随拖拽的v始及Ud的整个过E中不同事g的发生而发生变化(比如?/span>dragover事g中可能根据当时情况将图标变ؓ一个叉表示不能拖入Q;同时Q对于拖拽源lg和目的组Ӟ随不同的事g通知也会被程序设计ؓ产生不同的变化响应(比如Q拖拽结束的事g处理中可能指令目的组件复制源lg的文字内容)Q从而最l实C拖拽的效果?/span>

最后,看一?/span>JRE7中拖拽的实现cR?/span>

Swing?/span>JComponentlg一些功能委托给其成?/span>ComponentUI代理。比?/span>JTextField在构造方法中即会通过UIManager获得合适的TextUI实例Q?/span>UIManager根据当?/span>look and feel讄获取Q(此后JTextField?/span>paintҎ会调用该UI实例?/span>updateҎ从而完成组件绘画)Qƈ调用?/span>UI实例?/span>installUIҎQ在installUI中则包括l?/span>JTextField对象安装一些监听器Q安?/span>TransferHandlerq个支持拖拽的关键成员,它包?/span>DragHandler,DropHandler两个内部c,而这两个内部cL实现拖拽效果的核心逻辑Q安?/span>droptargetQ?/span>

Swing?/span>uicd分在几个包中Q其?/span>javax.swing.plaf中存放一些接口;javax.swing.plaf.basic中存攑֯接口的基本实玎ͼ卛_U?/span>LAF的通用实现Q?/span>javax.swing.plaf.metal中存?/span>java默认LAF实现Q另外还?/span>javax.swing.plaf.multi用来实现多个LAF的综合效果实玎ͼjavax.swing.plaf.synth用来实现可通过配置xml文g更换颜色{皮肤的实现?/span>

对于拖拽斚wQ?/span>BasicUI?/span>installUI中一般会对组件安?/span>mouseListenerQ?/span>

editor.addMouseListener(dragListener);

editor.addMouseMotionListener(dragListener);

?/span>dragListener监听发生在lg上的鼠标事gQ当发现可能是新启动的拖拽鼠标动作ƈ且组?/span>dragEnableӞ则立刻通知DragRecognitionSupport单例q行lg拖拽识别。该support单例L别鼠标动作本w,认是组件拖拽开始,再通知lg?/span>TransferHandler成员对象q行拖拽初始化,?/span>Q?/span>l其辨别headless环境?/span>action支持后将初始化徏立ƈ委托调用TransferHandler.SwingDragGestureRecognizer的全局单例(成员包括全局单例dragsource?/span>draghandler对象)Q该实例注册拖拽识别listener及设|?/span>sourceAction,最l将通知TransferHandler.DragHandler对象?/span>dragGestureRecognized。在该方法中Q将创徏transferable及初始化autoscrollQƈ通过dragSource全局单例完成创徏DragContext,q获取及初始?/span>DragContextPeer全局单例Q给该单例注册上?/span>component作ؓ拖拽 triggerQ以?/span>native code可以在处理底层事件时Q可以通过x,y判定是否containsQ从而羃事件处理范_Qƈ通知DragContextPeer单例拖拽开始,?/span>DragContextPeer单例则会调用底层native codeq行q一步的处理?/span>

此后AWTU程通过windows-api获取到系l底层的各种拖拽事gq进行底层处理,处理q程会随时引用DragContextPeer单例Q处理逻辑包括ҎtriggerqoQ,q最l通知该单例合适的事g通知?/span>Peer会将q些事g装成合适的DragEventq提交给EDT处理Q提交后促?/span>AWTU程模拟{待EDT处理完该事g?/span>EDT的处理逻辑是将事g交给拖拽开始时l组件创建的DragContext处理Q而该context对象的处理则会调用其dragHandler成员的对应方法进行事件处理,以及l?/span>dragSource单例相应的监听通知Q最?/span>updateCurrentCursor{,最?/span>EDTq回?/span>AWT,peer处理q回l?/span>native codel箋处理?/span>

当拖拽开始后Q鼠标图标在一?/span>swinglg上游晃时Q首?/span>windows会对光层容器(?/span>jwindowsQ视作拖拽源Q经native codeqo后,如果?/span>swinglg是此ơ拖?/span>triggerQ源Q,?/span>DragContextPeer能得?/span>dragover的通知Q进而进行后l处理;同时从另一个方面,q个也被视作一个拖拽目的,?/span>AWTU程q会Ҏơ拖拽启动徏立一?/span>DropContextPeerQؓ来支持q发Q,q调用该peer?/span>handle事gҎQ该Ҏ会将此底层事件包装后提交l?/span>EDTq促?/span>AWT{待Q?/span>EDT处理该事件时?/span>track到该事g发生时的层lgQ以及事件发生的坐标位置Q由层容器lg?/span>LightweightDispatcherq行初步处理。这个处理将p事g产生CӞ?/span>event sourcecontainerQ比?/span>JFRAMEQ变为精的jcomponent(比如JTextField),同时对于eventId=dragover的事Ӟ有可能根据具体情况再增加dragExitQ?/span>dragEnter两个事gQ比如对jframeH体?/span>dragoverQ但鼠标实际是从一?/span>jtextfield到另外一?/span>jtextfieldQ,q些_的事件的处理会再ơ回?/span>DropContextPeer中得到对应的process。这时的process会处理本w的一些成员数据(当前context,当前droptarget{)Q再事件委托给source jcomponent?/span>droptargetq行处理Q如果已安装Q,此时的处理将是传递给对应lg?/span>drophandlerq行处理Q同时会通知droptarget的注册监听,最?/span>initializeAutoscrolling{?/span>drophandler在处理过E中?/span>event可以q行accept?/span>rejectQ这两个动作会再去调?/span>dropcontextq行处理Qƈ最l{?/span>peer处理成员数据。最?/span>edtq回?/span>AWT,peer handle处理l束q回native code当前drop action|native codel箋处理?/span>

通过以上的分析,如果需要定?/span>swinglg的拖拽逻辑Q一个比较基的入口是transferhandlerQ因为所有事件的处理都将l过其两个内部类逻辑处理(DragHandler?/span>DropHandler)Q?/span>swing包中?/span>TransferHandler的具体实玎ͼ是这两个内部cȝҎ都把一些控制划分给?/span>componet的一些属性设|或TransferHandler本n的回调方法,所以只需对组件设|合适的属性,或承ƈoverride TransferHandler合适的Ҏq给?/span>swinglg重新setTransferHandlerQ即可以定制新的逻辑。如果需要更深层ơ的定制Q则需要细致考虑上述分析Q选择合适的定制炏V?/span>



英雄 2008-10-10 13:37 发表评论
]]>
javaq?问题http://www.tkk7.com/baixch/archive/2008/10/08/233140.html英雄英雄Wed, 08 Oct 2008 07:07:00 GMThttp://www.tkk7.com/baixch/archive/2008/10/08/233140.htmlhttp://www.tkk7.com/baixch/comments/233140.htmlhttp://www.tkk7.com/baixch/archive/2008/10/08/233140.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/233140.htmlhttp://www.tkk7.com/baixch/services/trackbacks/233140.html 目上遇到啦Q环境是Q?br /> 1.中间件和数据库都各自在hp-unix机器上。数据库oracle字符集采用ZHS16GBKQ中间gQ基于jdk1.5Q启动时指定字符集是#export lang=zh_CN.hp15CN?br /> 2.客户端采用applet实现?br /> 情况是有个人名“李袆”,通过客户端输入保存后Q再查询出来变成了“?”?br /> 好啦Q重新复习一下javaq问题Qgoogle了一大把Q有的说得都不对Q现在先推荐两篇权威的?br /> http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/Q?a >http://java.sun.com/developer/technicalArticles/Intl/Supplementary/Q?br /> 开始解决问题啦?br /> 1.jvm在内存里存字W串是以utf-16存的Q但是class文g和序列化对象文g里的字符串内容以“modified”utf-8存;
在jvm1.5里char代表的是~码unitQ不是编码point。这样就有可能两个char才代表一个字W。这?#8220;代表”的变化是为适应unicode?.0升到2.0版本Q老jdk到新jdk的一个概忉|变,很多api和jdk工具因此也发生变化。那时unicode1.0里就是定?6位代表字W,所以老jdk里一个char׃表一个pointQ当然也是一个unit。但是unicode2.0扩展开来了Q因此ؓ了兼容,新jdkq定一个char只代表一个unitQ表CZ个point得用int?br /> “modified”utf-8是javaҎ准utf-8~码的一Ҏ改,可以认ؓ是种Ҏ~码Qؓ了适应java需要而存在的字符集?br /> 2.客户端接受输入法输入后,在客Ljvm里以utf-16?#8220;?#8221;Q而后发送给中间件是通过序列化,?modifed"utf-8传送,中间件反序列化就又在中间件jvm里以utf-16?#8220;?#8221;啦。这时中间g里的那个java对象要通过 jdbcloracle发送过L字符Ԍoracle的jdbc驱动以pȝ默认字符集进行编码传送。可是zh_CN.hp15CN是gb2312标准Q没有这个生dQ只好搞一?#8220;不存在编?#8221;~码Q这一~码把信息丢失了;而数据库是以ZHS16GBK认识接受到数据,这?#8220;损坏的字”存到数据文g里啦。这里请问下同行读?oracle数据库端会不会做zh_CN.hp15CN到ZHS16GBK的{码还是直接认Zq来的一定是ZHS16GBK直接存到数据文gQ我个h认ؓ数据库不做这U{码,费性能么。但不管怎么_在中间g哪里Q?#8220;?#8221;字就?#8220;损坏”了,传到数据库怎么样也无法恢复了?br /> 3.q样客户端再去获取时肯定是显CZ出来“?#8221;字啦?br /> 于是让客h?export lang=zh_CN.gb18030再启动中间gQ问题解冟?br /> 补充Q?br /> 1.oracle的jdbc thin驱动是q样Q用系l默认字W集q行传送编码,不像mysql可以在连接url中指定。不q我个h认ؓq也不错Q因Z即在url指定正确的编码格式,q要保证操作pȝ装着q个字符集呢?br /> 2.jsp%@page   contentType="text/html;charset=gb2312" language="java" pageEncoding="gb2312"%q个标记分两部分QpageEncoding是指jsp文本文g本n存在盘的编码格式,servlet容器按这个编码格式读取,从而再做{码到合适编码(一般utf-8Q的java文gQ再~译成含“modified utf-8字符?#8221;的class文gQ再加蝲成实例对象;当该对象吐出responseӞ以contentType里的charsetq行~码在网上传送给客户端,q置response头信息编码格式?br /> 3.览器客L接受到responseӞ会根据头信息获取~码格式Q从而解析出正确字符Q再Ҏhtml规范q行昄。而对于网|交表单时Q也会根据这个信息进行表单内Ҏ据的~码。编码后再进行url~码卛_送给服务器。可是表单输入有可能出q个字符集,则多数浏览器会采?#Qunicode point numberQ来~码q个字符Ql发送给服务器。同P如果览器在接受responseӞ得到q种形式的字W串Q多C进行解码从而显C出来?br /> 4.多数servlet容器在解析request获取参数时统一采用默认配置的iso-8859-1。这个字W集只包含西Ƨ字W,因此解析前统一setCharacterEncoding是必ȝ?当然多数都也可以修改默认配置啦?

英雄 2008-10-08 15:07 发表评论
]]>
HTTPCLIENT性能调优译http://www.tkk7.com/baixch/archive/2008/08/12/221483.html英雄英雄Tue, 12 Aug 2008 06:29:00 GMThttp://www.tkk7.com/baixch/archive/2008/08/12/221483.htmlhttp://www.tkk7.com/baixch/comments/221483.htmlhttp://www.tkk7.com/baixch/archive/2008/08/12/221483.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/221483.htmlhttp://www.tkk7.com/baixch/services/trackbacks/221483.htmlhttpclient的默认配|提供了最大的可靠性和标准的遵守,而不是性能。(哪个标准Q难道是指HTTP协议规范Q)有几个配|选项和优化技术,可以昄提高httpclient 的性能表现?本文档给Z对httpclient如何调优的大UӀ?br />

1.重用HTTPCLIENT实例?/font>

          一般说来,一个通讯lgQ甚臌一个应用Y件就始终l持一个HttpClient对象实例存在。但是如果你的应用很E|才用到它,而且q不允许q么一个实例一直存在,那么Q这里强烈徏议,每次在disposing 它之前,一定要昑ּ地shut down 它的 multithreaded connection manager 。这样做是确保连接池里的connection得到释放?/span>

2.持箋q接不关闭?/span>

httpclientL量重用q接。它不要求Q何配|,默认情况下就是这栗某些情况下Q这可能Dq接泄漏Q而耗尽资源。禁用持l连接最单的Ҏ是提供或扩展一个connection managerQ在releaseConnection被调用的时候,q个connection manager把connection真正关闭?/span>?/span>

3.http method的ƈ发执行。(实际上是在对1.延Q?br /> 如果应用E序逻辑允许q发执行多个HTTPhQ(例如对多个服务器的多个ƈ发请求,或对同一个服务器代表不同用户w䆾的多个请求) Q应用程序可以ؓ每一个HTTP session开启一个专门的U程Q这L设计自然带来显著的性能提升?而当使用一个线E安全的q接理器,如multithreadedhttpconnectionmanagerӞHttpClient能保证线E安全。这P多个U程可以׃nq么一个线E安全的HttpClient实例。请注意Q应用程序的每个各自执行的线E必M用各自的httpmethod实例Qƈ且可配置各自的httpstate实例?或hostconfiguration实例Q代表一个特定的会话状态和L配置Q。这个共享的HttpClient和其标配的multithreadedhttpconnectionmanagerؓ各线E带来最高的性能?/span>
4.request/response entity 技术处?/span>
HttpClient能够有效地流处理request,response。就是说大的entity可以不用在内存(泛滥Q缓存就发送或接收。这点在多请求ƈ发时其关键。虽然提供了Ҏ可以通过讉K字符串或字节l的方式处理数据Q而不是通过)Q但是不q样做。因为除非特别仔l,q样做很Ҏ引v内存溢出Q因些方法实际上是把整个entity都缓存在了内存中?br /> responseAPIQ徏议用HttpMethod#getResponseBodyAsStreamQ将response体作为字?字符处理;不徏议用HttpMethod#getResponseBody 和HttpMethod#getResponseBodyAsString ?br /> requestAPIQ对于request的流处理Q技术难题在于如果通讯q程出现问题Q认证失败或iop|Q,那么需要对发送的request entityq行重新获取,重新发送。很明显Q?request的数据来源于应用E序的各个方?Q除了可以提供APIQNameValuePair 形式Q处理可完全~存在内存的数据Q字节组{)Q不Ҏ提供l一的API。因此(对于大块的entityQ,E序员可通过自行l承RequestEntityQ在相应回调Ҏ里进行流化处理?/span>
5.Expect-continue handshake

 HTTP提供HTTP 100 (Continue) 状态,是指客户端发送一?#8220;预期HTTP100”的请求headerQ如果服务器响应100说明接受该客LhQ则客户端l发送body。是啊,如果服务器通过headerp判断是否响应100q是拒绝Q那么不通过q条路就直接发送bodyQ尤其是大bodyQ真的太费资源了。授权拒l是最典型的情形了。因此强烈徏议对于那些有HTTP认证要求的服务器使用“预期HTTP100”q种通讯方式。注意如果通讯要通过代理Q程序员要处理可能的警告Q因Z些老的HTTP1.0代理服务器不能正处?#8220;预期HTTP100”通讯方式?br /> 6. 钝态连接的?/span>
HTTP协议规范允许客户端或服务器端不知会对方,在Q意时刻都可以l止一个连接(指底层网l连接)Q因此这个connection变成了钝态或者说陈旧了,反正是不能用了。在默认情况下,HttpClient 会在执行HTTPҎ前检查要用的q接Q看看是否是钝态。这个检查需耗时15-30msQ根据用的jre不同而不同。关闭这个检查能带来部分的性能提升Q尤其对于小负蝲responseq种通讯。但是关闭后可能面底层q接已关闭的异常Q服务器d关闭但没通知客户端)?/span>
7.Cookie 处理
如果一个应用程序,例如web spiderQ不需要和服务器保持会话状态,则禁用cookie会带来轻微的性能提升?br />



英雄 2008-08-12 14:29 发表评论
]]>
MDA 于JAVAhttp://www.tkk7.com/baixch/archive/2008/06/26/210829.html英雄英雄Thu, 26 Jun 2008 06:58:00 GMThttp://www.tkk7.com/baixch/archive/2008/06/26/210829.htmlhttp://www.tkk7.com/baixch/comments/210829.htmlhttp://www.tkk7.com/baixch/archive/2008/06/26/210829.html#Feedback0http://www.tkk7.com/baixch/comments/commentRss/210829.htmlhttp://www.tkk7.com/baixch/services/trackbacks/210829.html现在元数据驱动架构的应用日益q泛了。这U模式的应用一般ؓ公司的架构师Ҏl验提供一套schema定义Q而业务逻辑实现由原来的~码转ؓ按照此schema定义数据。之后有些系l用代码生成机制来生成代码Q而有些系l则采用~写一套框架类Q执行时解析定义数据Q从而执行数据所表达的逻辑。这两种方式各有利弊?br /> 对于W一U方式,会生成一堆固定模式的代码Q如果允许直接修改这些代码,造成很大的维护量Q第二种方式Q由于是解析执行Q非常值得怀疑是否会造成JVM hotspot机制qQ从而导致性能问题Q最理想的方式我个h认ؓ是生成代码,但限制这些代码ؓ只读代码Q同时保证这些生成代码也要徏立在框架l构之上Q从而可以再灉|动态拦截进代码。这样一斚wQ提供了MDA外的补充Q即可以插写代码Q另一斚w可以充分利用JVM hotspot~译执行机制?br /> 前面也提CQ由于MDAh于架构师的经验,因此schema是不太可能保|万象的。MDA在项目上的应用必要提供一U补充机制。一般也是采用AOP切面~程或回调机制来做这件补充。首先保证项目的价值实玎ͼ然后再后期将q些代码实现抽象qschema的范_从而扩大元数据的表达能力。我个h认ؓ元数据扩大的极限是~程语言Q呵呵,x吧,q个认识不是IQ所以我MDA的系l一定是留着补充机制的?/font>



英雄 2008-06-26 14:58 发表评论
]]>
վ֩ģ壺 ëƬ߹ۿ| þþƷAV뽿ɫ | ĻAVJI| Ļ| Ʒavɫ| ޴߶ר| þþƷձҰ| aëƬѹۿվ| Ƭѿ| 8xվ߹ۿ| ëƬӰƬ| ձaƬѿ| ޳?vƬ| þAV˳׽| Ůһ| ˳ˬһ| þҹҹ³³Ƭ | 182tvѹۿƵ| Ƶ| պ߹ۿ| ޹һ߹ۿ| ѸAëƬ߲| ձƵѸһ18| Ƭѿ| þ޾ƷĻ| һvѲһ| ձzzzzwwwƬ| պþ| һҺ| wwwѸƵ| ޹˾Ʒþþùһ | 鶹˾þþƷ| ѿaɫƬ| ˳ۺ߲| ҹˬˬˬŮѹۿӰԺ| ޾ƷA߹ۿ| jizzӰӹۿվ| ޹Ʒ˾þ | þ޹ӰԺ| AVվ| ѹۿƵ|