GEF是eclipse中图形绘制插件,它是基于draw2d,下面来看下它的机制
先看一个draw2d程序,
要有一个LightweightSystem,然后给这个LightweightSystem的setcontents函数传递一个figure,这个figure就是LightweightSystem的根figure了。
public static void main(String args[])
{
final Label label = new Label("Press a button!");
Shell shell = new Shell();
LightweightSystem lws = new LightweightSystem(shell);
Figure parent = new Figure();
parent.setLayoutManager(new XYLayout());
lws.setContents(parent);
Clickable above = new CheckBox("I'm above!");
parent.add(above, new Rectangle(10,10,80,20));
ButtonModel aModel = new ToggleModel();
aModel.addChangeListener(new ChangeListener()
{
public void handleStateChanged(ChangeEvent e)
{
label.setText("Above");
}
});
above.setModel(aModel);
Clickable below = new CheckBox("I'm below!");
parent.add(below, new Rectangle(10,40,80,20));
ButtonModel bModel = new ToggleModel();
bModel.addChangeListener(new ChangeListener()
{
public void handleStateChanged(ChangeEvent e)
{
label.setText("Below");
}
});
below.setModel(bModel);
ButtonGroup bGroup = new ButtonGroup();
bGroup.add(aModel);
bGroup.add(bModel);
bGroup.setDefault(bModel);
parent.add(label, new Rectangle(10,70,80,20));
shell.setSize(130,120);
shell.open();
shell.setText("Example");
Display display = Display.getDefault();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep ();
}
那在GEF中如何实现上面这一个过程的呢。
public abstract class GraphicalEditor
extends EditorPart
implements CommandStackListener, ISelectionListener
{
public void createPartControl(Composite parent) {
createGraphicalViewer(parent);
}
protected void createGraphicalViewer(Composite parent) {
GraphicalViewer viewer = new ScrollingGraphicalViewer();
viewer.createControl(parent);
setGraphicalViewer(viewer);
configureGraphicalViewer();
hookGraphicalViewer();
initializeGraphicalViewer();
}
ScrollingGraphicalViewer的createControl,完成lws和composite的关联。
public final Control createControl(Composite parent) {
FigureCanvas canvas = new FigureCanvas(parent, getLightweightSystem());
setControl(canvas);
installRootFigure();
return canvas;
}
protected LightweightSystem getLightweightSystem() {
return lws;
}
private final LightweightSystem lws = createLightweightSystem();
这样就创建一个LightweightSystem了,并和composite关联了。
那LightweightSystem得setcontents在哪呢:
在installRootFigure这个函数:
private void installRootFigure() {
if (getFigureCanvas() == null)
return;
if (rootFigure instanceof Viewport)
getFigureCanvas().setViewport((Viewport)rootFigure);
else
getFigureCanvas().setContents(rootFigure);
}
public void setViewport(Viewport vp) {
if (viewport != null)
unhookViewport();
viewport = vp;
lws.setContents(viewport);
hookViewport();
}
也就是说viewport就是rootifigure.
那这个rootfigure是哪来的呢:
这个是在GraphicalViewer创建时就创建了;
Rootfigure是RootEditPart的createfigure创建的。
GraphicalViewer继承GraphicalViewerImpl
public GraphicalViewerImpl () {
createDefaultRoot();
setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.NONE),
MouseWheelDelegateHandler.SINGLETON);
}
protected void createDefaultRoot() {
setRootEditPart(new ScalableRootEditPart());
}
public void setRootEditPart(RootEditPart editpart) {
super.setRootEditPart(editpart);
setRootFigure(((GraphicalEditPart)editpart).getFigure());
}
protected void setRootFigure(IFigure figure) {
rootFigure = figure;
getLightweightSystem().setContents(rootFigure);
}
当然GraphicalViewer的rooteditpart可以通过setrooteditpart函数改。
public void setRootEditPart(RootEditPart editpart) {
super.setRootEditPart(editpart);
setRootFigure(((GraphicalEditPart)editpart).getFigure());
}
public void setRootEditPart(RootEditPart editpart) {
if (rootEditPart != null) {
if (rootEditPart.isActive())
rootEditPart.deactivate();
rootEditPart.setViewer(null);
}
rootEditPart = editpart;
rootEditPart.setViewer(this);
if (getControl() != null)
rootEditPart.activate();
}
protected void setRootFigure(IFigure figure) {
rootFigure = figure;
getLightweightSystem().setContents(rootFigure);
}
当然设置后会覆盖原来的。
转载自http://sjj0412.cublog.cn/
分享到:
相关推荐
gef布局显示学习
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
GEF图形编辑框架使用指南,从新手到入门,详细的讲解了如何使用GEF进行图形编辑
GEF入门系列,八进制 的GEF入门系列教程, 由社区经作者授权后整理而成GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很...
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很多,例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化...
NULL 博文链接:https://ojeta.iteye.com/blog/1485997
GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之三。
GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之二。
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制
一个GEF的简单例子,简单的做了一下,包括源码。
GEF理解之第一部分,学习gef必备文档资料啊,值得下载
一个GEF的例子,例子中展示了利用GEF往画布上添加节点 删除节点,以及树形展现等得荣
eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF
这是我参考了一些其他资料,自己写的一个GEF示例程序。 在这个demo中你可以看到以下的功能: 1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变...
GEF示例 博文链接:https://xyhsm.iteye.com/blog/67809
我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload
GEF eclipse 插件
GEF简易教程-学习GEF的入门教程,不错的gef入门教程