`
yonlist
  • 浏览: 82998 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GEF图形显示机制(一)

阅读更多

GEFeclipse中图形绘制插件,它是基于draw2d,下面来看下它的机制

先看一个draw2d程序,

要有一个LightweightSystem,然后给这个LightweightSystemsetcontents函数传递一个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();

}

ScrollingGraphicalViewercreateControl,完成lwscomposite的关联。

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关联了。

LightweightSystemsetcontents在哪呢:

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创建时就创建了;

RootfigureRootEditPartcreatefigure创建的。

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);

}

 

当然GraphicalViewerrooteditpart可以通过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布局显示学习

    RCP 视图显示GEF图

    用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);

    GEF开发指南

    GEF图形编辑框架使用指南,从新手到入门,详细的讲解了如何使用GEF进行图形编辑

    GEF入门系列.rar

    GEF入门系列,八进制 的GEF入门系列教程, 由社区经作者授权后整理而成GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很...

    GEF-ALL-3.2.2

    GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...

    GEF入门详解DOC文档

    GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很多,例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化...

    [翻译]Eclipse图形化编辑框架(GEF)/更新第7章:层和视图

    NULL 博文链接:https://ojeta.iteye.com/blog/1485997

    gef-step3.zip_3gef_GEF eclipse_GEF-step2_gef_gef-st

    GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之三。

    gef-step2.rar_GEF eclipse_gef

    GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之二。

    GEF框架入门学习

    这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。

    GEF入门必读 GEF入门系列 GEF-whole-upload

    GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制

    一个GEF的简单例子

    一个GEF的简单例子,简单的做了一下,包括源码。

    GEF理解系列1

    GEF理解之第一部分,学习gef必备文档资料啊,值得下载

    GEF 开发示例 树形展现(第二版)

    一个GEF的例子,例子中展示了利用GEF往画布上添加节点 删除节点,以及树形展现等得荣

    eclipse3.4的可视化开发GEF

    eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF

    GEF 开发简单示例

    这是我参考了一些其他资料,自己写的一个GEF示例程序。 在这个demo中你可以看到以下的功能: 1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变...

    GEF 进阶,第一部分: Anchor

    GEF示例 博文链接:https://xyhsm.iteye.com/blog/67809

    自己下的GEF资源打包

    我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload

    GEF 3.10 eclipse 插件

    GEF eclipse 插件

    GEF简易教程-学习GEF的入门教程

    GEF简易教程-学习GEF的入门教程,不错的gef入门教程

Global site tag (gtag.js) - Google Analytics