Eclipse JFace Binding/绑定 (3)

前文Eclipse JFace Binding/绑定 (1)”Eclipse JFace Binding/绑定 (2)”分别讲述了JavaBean API的事件机制和Eclipse JFace Binding的SWT控件属性和JavaBean属性的绑定。本文是本系列的最后一篇,讲述JFace中TableViewer、TreeViewer和ListViewer的绑定,由于TableViewer比较有代表性,因此使用TableViewer作为示例。

为什么需要WritableList、WritableSet和WritableMap

在做任何事情之前,先要提出一个为什么,“当你保持一颗好奇的心,当你愿意去问“为什么”,而不是一味得不假思索得接受,你便能够从一件事物的不同角度去审度,你就站得更高,看得更远”——这是 《Sandra Lee: 人生很短,做自己喜欢的事 》中的一句话,我很喜欢。

提出这个问题,潜台词肯定是为什么不能直接用List、Set、Map呢?原因在于集合对象不同于普通对象,集合对象包括了一组对象,这组对象本身的属性改变需要监听自然不必说,对象的添加、删除也是需要监听的,因此Java Collection API中的List、Set和Map就不够用了,更何况几何对象中所包括的那一组对象还必须封装到一个WritableValue对象中,不然元素和GUI的绑定又得失效了。
Continue reading

Eclipse JFace Binding/绑定 (2)

前文《Eclipse JFace Binding/绑定 (1)》介绍了JavaBean的事件机制,Eclipse的绑定利用了这种机制,(据说Eclipse Binding的下一个目标是Pojo对象的双向绑定,利用asm这样的字节码操作库)。

绑定针对对象实例而不是类型

在深入之前,需要明确的是,在Java中绑定永远是针对对象实例的绑定,而不是针对对象类型的绑定。也就是说下面的代码会使model之前注册的监听器失效。 Continue reading

Eclipse JFace Binding/绑定 (1)

binding这个词挺有意思的,中文意译为“绑定”,音译也可以是”绑定“,但是“绑定”这个词看起来又不是像“巴士”这样的词一样属于外来词。我深深地感觉第一个把binding翻译成“绑定”的人当时一定感觉很好。

为什么需要“绑定”

在MVC架构中,View(GUI)上的控件的值来源于Model,用户在View上的操作也需要更新到Model。由于桌面应用程序的实时响应特性,后台服务(如数字校验、根据单价和数量计算总价)对Model的更新也需要实时通过View反馈给用户。
Continue reading

一步一步实现GEF – 9

很长一段时间没有继续写了,很多东西都快忘记了,赶紧捡起来

让你的GEF图元可以拖动和缩放

拖动算是最简单的用户交互吧,不过麻雀虽小,肝胆俱全,不理解其原理和设计思路,很难谈得上去应用,但是要理解这一整套交互模型又有相当的难度,本文虽重在实践,这里也略做介绍。后文中所述图元指EditPart对象实例。
Continue reading

Java实践:最好提供无参数的构造函数

一个类在没有显式定义构造函数的时候,Java会隐式提供一个无参数的构造函数。但是当显式定义了构造函数的情况下,Java就不会提供这个无参数的构造函数了。这是由于在显式定义的构造函数中可能进行了一些必要的初始化工作,此时如果错误调用默认无参构造函数会导致这些必须的初始化工作并没有完成,进而导致程序异常。

经过编程实践,本人认为还是有必要再显式定义了有参构造函数的情况下,仍然显式定义一个无参构造函数。主要原因是“最好提供缺省值”(It will be better to provide a default value),另外一个原因则是在工厂方法中大量使用的java.lang.Class.newInstance()方法只能调用无参构造函数。
Continue reading

JFace中的GridLayoutFactory和GridDataFactory

研究SWT Layout原理的时候,找到一个视频:《Creating a Custom Window Layout in Eclipse RCP Applications》,顿时被作者使用的GridLayoutFactoryGridDataFactory惊艳了,前些天,我还傻乎乎的自己写了几个简单的类实现相同的功能,无知真可怕。本文介绍了此两个类的用法,最后有一个简单的示例。

Continue reading

Eclipse RCP中获取Plugin/Bundle中文件资源的绝对路径

摘要:在进行Eclipse RCP开发的过程中,需要使用一些其他的资源(如图片、声音、配置文件、数据库等),我们一般将这些资源放到Plugin/Bundle的相应目录下(如图片资源放到icons目录,声音放到sounds目录,数据库文件放到data目录)。本文先对Eclipse Plugin和Bundle进行分析,之后讲解了如何使用Eclipse API通过这些资源的相对路径(相对于Plugin/Bundle)获取这些资源的绝对路径的方法,最后总结了org.osgi.framework.Bundle接口和FileLocator工具类的使用方法。
Continue reading