|
| |
精品推荐 |
 |
|
| |
|
|
|
|
使用图形编辑框架创建基于 Eclipse 的应用程序
|
日期:2008年6月12日 作者: 查看:[大字体
中字体 小字体]
|
图 4. 查看器中的 EditPart
内容的图形不是很有趣,并且它通常只是一个空面板,该面板将包含图的子图。它的图形应该为不透明类型(opaque),并且应当利用布局管理器进行初始化,该布局管理器将对图的子图进行布局。但是,它将拥有结构。图的直系子图是由返回的子模型对象列表确定的。清单 1 显示了一个样本内容 EditPart,它创建了一个不透明类型的图形,后者将使用 XYLayout 定位其子图。
清单 1. 内容 EditPart 的初始实现
public class DiagramContentsEditPart extends AbstractGraphicalEditPart { protected IFigure createFigure() { Figure f = new Figure(); f.setOpaque(true); f.setLayoutManager(new XYLayout()); return f; }
protected void createEditPolicies() { ... }
protected List getModelChildren() { return ((MyModelType)getModel()).getDiagramChildren(); } }
要确定图上的项,需要实现方法 getModelChildren() 。该方法返回子模型对象的列表(例如图中的节点)。超类将使用这个模型对象列表来创建对应的 EditPart。新创建的 EditPart 被添加到部件的子 EditPart 列表。这样又会将每个子 EditPart 的图形添加到示例图。缺省情况下,将返回一个空的列表,这表明没有子对象。
其它图形 EditPart 其余的 EditPart(表示图中的项)可能拥有要以图形方式显示的数据。它们可能还拥有自己的结构,例如连接或自己的子 EditPart。许多 GEF 应用程序利用由标签注明的图标之间的连接来描述这些图标。让我们假定您的 EditPart 将使用 Label 作为它的图形,并且您的模型提供了名称、图标以及与标签之间的连接。清单 2 显示了实现这种类型 EditPart 的第一次尝试。
清单 2. “节点”EditPart 的初始实现
public class MyNodeEditPart extends AbstractGraphicalEditPart { protected IFigure createFigure() { return new Label(); } protected void createEditPolicies() { ... } protected List getModelSourceConnections() { MyModel node = (MyModel)getModel(); return node.getOutgoingConnections(); } protected List getModelTargetConnections() { MyModel node = (MyModel)getModel(); return node.getIncomingConnections(); } protected void refreshVisuals() { MyModel node = (MyModel)getModel(); Label label = (Label)getFigure(); label.setText(node.getName()); label.setIcon(node.getIcon());
Rectangle r = new Rectangle(node.x, node.y, -1, -1); ((GraphicalEditPart) getParent()).setLayoutConstraint(this, label, r); } }
这里覆盖了一个新方法 refreshVisuals() 。当需要利用来自模型的数据更新图形时,就调用该方法。在本案例中,模型的名称和图标被反映在标签中。但更为重要的是,该标签是通过将其布局约束传递给父元素来定位的。在内容 EditPart 中,我们使用了 XY 布局管理器。该布局使用 Rectangle 约束来确定在何处放置子图形。宽和高的值为“-1”,表明应当为该图提供理想的大小。
技巧 #1 决不要使用 setBounds(...) 方法来放置图形。使用诸如 XYLayout 之类的布局管理器确保会正确地更新滚动条。另外,XYLayout 还处理将相对约束转换成绝对位置的工作,并且可用它来将图形自动调整为理想的大小(换而言之,如果约束的宽和高为 -1)。
方法 refreshVisuals() 仅在 EditPart 初始化的过程中调用一次,并且决不会被再次调用。在响应模型通知时,应用程序负责根据需要再次调用 refreshVisuals() 以更新图形。要改进性能,您可能希望将每个模型属性的代码分解成其自己的方法(或者是一个带有“开关(switch)”的方法)。这样,当模型发出通知时,可以运行最少的代码以便只刷新那些发生更改的内容。
上一篇:利用套接字机制实现Flash与数据库连接
下一篇:注册ActiveX控件的几种方法
|
| 相关文章: |
|
|
|
| 相关软件: |
|
|
|
|