[Eclipse]GEF入门系列(七、XYLayout和展开/折叠功能)
时间:2011-04-19 cnblogs bjzhanghao
前面的帖子里曾说过如何使用布局,当时主要集中在ToolbarLayout和FlowLayout(统称 OrderedLayout),还有很多应用程序使用的是可以自由拖动子图形的布局,在GEF里称为 XYLayout,而且这样的应用多半会需要在图形之间建立一些连接线,比如下图所示的情景。 连接的出现在一定程度上增加了模型的复杂度,连接线的刷新也是GEF关注的一个问题,这里 就主要讨论这类应用的实现,并将特别讨论一下展开/折叠(expand/collapse)功能的实现 。
图1 使用XYLayout的应用程序
还是从模型开始说起,使用XYLayout时,每个子图形对应的模型要维护自身的坐标和尺寸 信息,这就在模型里引入了一些与实际业务无关的成员变量。为了解决这个问题,一般我们 是让所有需要具有这些界面信息的模型元素继承自一个抽象类(如Node),而这个类里提供 如point、dimension等变量和getter/setter方法:
public class Node extends Element implements IPropertySource {
protected Point location = new Point(0, 0);//位置
protected Dimension size = new Dimension(100, 150);//尺寸
protected String name = "Node";//标签
protected List outputs = new ArrayList(5);//节点作为起点的连接
protected List inputs = new ArrayList(5);//节点作为终点的连接
…
}
[Eclipse]GEF入门系列(七、XYLayout和展开/折叠功能)(2)
时间:2011-04-19 cnblogs bjzhanghao
EditPart方面也是一样的,如果你的应用程序里有多个需要自由拖动和改变大小的 EditPart,那么最好提供一个抽象的EditPart(如NodePart),在这个类里实现 propertyChange()、createEditPolicy()、active()、deactive()和refreshVisuals()等常 用方法的缺省实现,如果子类需要扩展某个方法,只要先调用super()再写自己的扩展代码即 可,典型的NodePart代码如下所示,注意它是NodeEditPart的子类,后者是GEF专为具有连接 功能的节点提供的EditPart:
public abstract class NodePart extends AbstractGraphicalEditPart implements PropertyChangeListener, NodeEditPart {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Node.PROP_LOCATION))
refreshVisuals();
else if (evt.getPropertyName().equals(Node.PROP_SIZE))
refreshVisuals();
else if (evt.getPropertyName().equals(Node.PROP_INPUTS))
refreshTargetConnections();
else if (evt.getPropertyName().equals(Node.PROP_OUTPUTS))
refreshSourceConnections();
}
protected void createEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new NodeEditPolicy());
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new NodeGraphicalNodeEditPolicy());
}
public void activate() {…}
public void deactivate() {…}
protected void refreshVisuals() {
Node node = (Node) getModel();
Point loc = node.getLocation();
Dimension size = new Dimension(node.getSize());
Rectangle rectangle = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), rectangle);
}
//以下是NodeEditPart中抽象方法的实现
public C
|