加载中…
个人资料
WilliamChen
WilliamChen
  • 博客等级:
  • 博客积分:0
  • 博客访问:529,219
  • 关注人气:232
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

在Swing取词中添加动态内容支持

(2007-07-23 18:39:06)
标签:

java

swing

programming

分类: Swing
    一周没写博客了,一直在忙其他的事。最近对Swing辞典做了些修改,最大的变动是添加了对组件动态内容的检测支持。
    主要原理通过向组件注册事件处理器获知组件文字的更新事件,重新提取组件文字。做法是在dyno.swing.beans包下添加了个xml配置文件,插件启动时读取此文件,获取不同组件需要注册事件处理器信息:                                                                                                                                                        

<?xml version="1.0" encoding="UTF-8"?>

<!--
    Document   : sensor.xml
    Author     : William Chen
    Description:
        Purpose of the document follows.
-->

<sensors>
    <sensor component="javax.swing.JList">
        <listener source="model" class="javax.swing.event.ListDataListener">
            <event name="intervalAdded"/>
            <event name="intervalRemoved"/>
            <event name="contentsChanged"/>
        </listener>
    </sensor>
    <sensor component="javax.swing.JTable">
        <listener source="model" class="javax.swing.event.TableModelListener">
            <event name="tableChanged"/>
        </listener>
    </sensor>
    <sensor component="javax.swing.JTree">
        <listener source="this" class="javax.swing.event.TreeExpansionListener">
            <event name="treeCollapsed"/>
            <event name="treeExpanded"/>
        </listener>
        <listener constraints="model" class="java.beans.PropertyChangeListener">
            <event name="propertyChange"/>
        </listener>
    </sensor>
    <sensor component="javax.swing.text.JTextComponent">
        <listener source="document" class="javax.swing.event.DocumentListener">
            <event name="insertUpdate"/>
            <event name="removeUpdate"/>
            <event name="changedUpdate"/>
        </listener>
        <listener source="document" class="javax.swing.event.UndoableEditListener">
            <event name="undoableEditHappened"/>
        </listener>
        <listener constraints="document" class="java.beans.PropertyChangeListener">
            <event name="propertyChange"/>
        </listener>
    </sensor>
    <sensor component="javax.swing.AbstractButton">
        <listener constraints="text" class="java.beans.PropertyChangeListener">
            <event name="propertyChange"/>
        </listener>
    </sensor>
    <sensor component="javax.swing.JLabel">
        <listener constraints="text" class="java.beans.PropertyChangeListener">
            <event name="propertyChange"/>
        </listener>
    </sensor>
</sensors>

 

    比如当应用程序调用JLabel.setText来改变标签文字时,会触发名称为text的propertyChange事件,通过:
   <sensor component="javax.swing.JLabel">
        <listener constraints="text" class="java.beans.PropertyChangeListener">
            <event name="propertyChange"/>
        </listener>
    </sensor>

    取词插件为所有JLabel组件添加侦听text属性变化事件,处理时将WordPicker当前文字内容设置为无效状态。鼠标移动时,WordPicker如果发现当前内容已经失效,就会重新取词。

    通过注册组件内容更新事件的方式来通知取词,避免周期性频繁取词带来的性能消耗。

    取词插件为组件添加事件处理器时,采用了动态代理的方法动态生成事件处理类。动态代理是JDK 1.3引入的功能,能为接口动态生成实现类,对代理对象方法的激活都被派发到一个InvocationHandler中处理。这儿InvocationHandler的实现只是简单地将WordPicker内容设置成无效。

    除了上面改动,还对位置检测算法做了进一步优化。屏幕取词所获得的单词按照位置进行排序,鼠标位置检测采用类似折半查找的方法,使得位置检测所进行的比较次数大大减小,提升了检测效率。

    经过这次改进,取词插件的运行性能大大提升,取词、检测以及显示翻译内容都非常流畅。下面是一些截屏:

在Swing取词中添加动态内容支持

在Swing取词中添加动态内容支持

在Swing取词中添加动态内容支持

在Swing取词中添加动态内容支持

     源代码在此下载

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有