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

一步一步实现GEF – 8

将View中的图形移到编辑器中

在View中是不能对图形进行移动、修改大小的,需要对图形进行修改必须使用Editor,因此,我们首先创建一个GEF编辑器,然后将图形显示在编辑器中。

创建编辑器

打开plugin.xml,打开Extensions标签页,添加org.eclipse.ui.editors扩展,然后添加一个Editor,Name为Nodes GEF Editor,Extensions为gef,如下图所示:
Continue reading

一步一步实现GEF – 7

添加Tooltips

我们希望用户将鼠标移动到图元上时,能够友好的显示图元的一些详细信息,可以通过Tooltip的方法实现。GEF中Figure类中定义了图元的Tooltip,其类型为IFigure,因此我们可以创建一个Label,然后将Label作为图元的Tooltip显示。
在NodeFigure类中添加一个私有方法createToolTip(),将结点的位置和背景的颜色显示给用户。
Continue reading

一步一步实现GEF – 6

添加连接线

要在两个结点(Node)之间显示连接线,需要在模型上添加连接线,修改showDiagram()函数,在node和node2之间添加一个Connection对象,为了方便,先在Connection类中添加connection()方法,如下所示:

public void connect(Node source, Node target){
	setSource(source);
	setTarget(target);
	source.addOutgoingConnection(this);
	target.addIncomingConnection(this);
}

Continue reading

一步一步实现GEF – 5

显示Diagram模型

到目前为止,仅仅显示了一个节点(Node)的图形,如何显示多个节点,也就是一个Diagram的模型呢?

我们修改NodeGefView类的showDiagram()方法,创建Diagram模型,并且创建两个Node模型,加入到Diagram中。

private void showDiagram() {
	Diagram diagram = new Diagram();
 
	Node node = new Node();
	node.setText("测试节点");
	node.setLocation(new Point(10, 10));
	diagram.addNode(node);
 
	Node node2 = new Node();
	node2.setText("测试节点");
	node2.setLocation(new Point(10, 70));
	diagram.addNode(node2);
 
	graphicalViewer.setContents(diagram);
}

但是运行时发现,现在视图上无显示,连上一步显示的Node模型对应的矩形框都没有了。
Continue reading