`

draw2d详述(LightweightSystem)

 
阅读更多

作为gef的展现层draw2d以其轻量灵活著称,在了解gef的同事,如果不花足够多的时间了解draw2d,就相当你有一半是无知的。

 

 

1.LightweightSystem与GraphicalViewerImpl:

   它为SWT与draw2d建立联系,使得Figure能够很好的被Canvas管理。

   要达到这个目的,必须做三件事:1.创建一个Canvas。2.创建一个LightweightSystem,并且把Canvas对象传递给它。3.创建一个rootFigure并且把它传递给LightweightSystem。这样LightweightSystem就能管理Canvas和rootFigure的关系了。

 

这三件事在GraphicalViewerImpl里面是可以找的到的:

 

 

protected LightweightSystem createLightweightSystem() {
		return new LightweightSystem();
	}

 创建LightweightSystem

 

 

public Control createControl(Composite composite) {
		setControl(new Canvas(composite, SWT.NO_BACKGROUND));
		return getControl();
	}

 

 

protected void hookControl() {
		super.hookControl();
		getLightweightSystem().setControl((Canvas) getControl());
		getControl().addFocusListener(lFocus = new FocusListener() {
			public void focusGained(FocusEvent e) {
				handleFocusGained(e);
			}

			public void focusLost(FocusEvent e) {
				handleFocusLost(e);
			}
		});
	}

 创建Canvas并把它赋给LightweightSystem

 

 

protected void setRootFigure(IFigure figure) {
		rootFigure = figure;
		getLightweightSystem().setContents(rootFigure);
	}

 rootFigure也被赋给LightweightSystem了。

 

 

public void setEditDomain(EditDomain domain) {
		super.setEditDomain(domain);
		// Set the new event dispatcher, even if the new domain is null. This
		// will dispose
		// the old event dispatcher.
		getLightweightSystem().setEventDispatcher(
				eventDispatcher = new DomainEventDispatcher(domain, this));
	}

 另外还传递了一个DomainEventDispatcher给LightweightSystem了。

 

DomainEventDispatcher是一个事件调度器,它继承自SWTEventDispatcher,在DomainEventDispatcher里面,它是把获取到的事件,转发给EditDomain进行处理,这个可以跟前面EditDomain能够获取到事件这一事实穿起来。

 

总结:在GraphicalViewerImpl里面创建一个LightweightSystem,并且让它管理SWT和draw2d相关组件。当GraphicalViewerImpl要刷新是,也是直接调用LightweightSystem的UpdateManager进行刷新。

 

 

 

2.LightweightSystem的内部:

(1)我们知道Figure不是SWT控件,但是却能够监听很多事件,是谁告诉它的呢?是它的SWT父canvas,canvas会监听事件,然后把事件给EventDispatcher,gef里面是DomainEventDispatcher,DomainEventDispatcher会把事件给EditDomain,EditDomain会把事件给当前活动的tool,tool会给editpart进行处理。(整条路通了)

 

 

protected void addListeners() {
		EventHandler handler = createEventHandler();
		canvas.getAccessible().addAccessibleListener(handler);
		canvas.getAccessible().addAccessibleControlListener(handler);
		canvas.addMouseListener(handler);
		canvas.addMouseMoveListener(handler);
		canvas.addMouseTrackListener(handler);
		canvas.addKeyListener(handler);
		canvas.addTraverseListener(handler);
		canvas.addFocusListener(handler);
		canvas.addDisposeListener(handler);
		canvas.addListener(SWT.MouseWheel, handler);

		canvas.addControlListener(new ControlAdapter() {
			public void controlResized(ControlEvent e) {
				LightweightSystem.this.controlResized();
			}
		});
		canvas.addListener(SWT.Paint, new Listener() {
			public void handleEvent(Event e) {
				LightweightSystem.this.paint(e.gc);
			}
		});
	}
 

(2)上面说道的只是一条路,事件的响应和处理。在LightweightSystem里面,所以设计到对Figure的重绘都是在UpdateManager里面进行的。

 

UpdateManager抽象类里面,主要是描绘脏区域,以及对脏区域进行重绘。

 

 

public void addDirtyRegion(IFigure figure, Rectangle rect) {
		addDirtyRegion(figure, rect.x, rect.y, rect.width, rect.height);
	}
 

 

public synchronized void performUpdate(Rectangle exposed) {
		addDirtyRegion(root, exposed);
		performUpdate();
	}

 

把rootFigure脏的位置,标记为脏。

 

 

public synchronized void performUpdate() {
		if (isDisposed() || updating)
			return;
		updating = true;
		try {
			performValidation();
			updateQueued = false;
			repairDamage();
			if (afterUpdate != null) {
				RunnableChain chain = afterUpdate;
				afterUpdate = null;
				chain.run(); // chain may queue additional Runnable.
				if (afterUpdate != null)
					queueWork();
			}
		} finally {
			updating = false;
		}
	}
 

刷新界面,repairDamage方法即是重绘的方法,

 

 

protected void repairDamage() {
		Iterator keys = dirtyRegions.keySet().iterator();
		Rectangle contribution;
		IFigure figure;
		IFigure walker;

		while (keys.hasNext()) {
			figure = (IFigure) keys.next();
			walker = figure.getParent();
			contribution = (Rectangle) dirtyRegions.get(figure);
			// A figure can't paint beyond its own bounds
			contribution.intersect(figure.getBounds());
			while (!contribution.isEmpty() && walker != null) {
				walker.translateToParent(contribution);
				contribution.intersect(walker.getBounds());
				walker = walker.getParent();
			}
			if (damage == null)
				damage = new Rectangle(contribution);
			else
				damage.union(contribution);
		}

		if (!dirtyRegions.isEmpty()) {
			Map oldRegions = dirtyRegions;
			dirtyRegions = new HashMap();
			firePainting(damage, oldRegions);
		}

		if (damage != null && !damage.isEmpty()) {
			// ystem.out.println(damage);
			Graphics graphics = getGraphics(damage);
			if (graphics != null) {
				root.paint(graphics);
				releaseGraphics(graphics);
			}
		}
		damage = null;
	}
 

没看的很懂,大致意思就那样,重绘脏区域。

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Draw2D 使用例子

    在IT领域,特别是图形用户界面(GUI)的开发中,Draw2D和GEF(Graphics Editing Framework)是两个重要的开源库,主要用于构建可定制的、交互式的2D图形编辑工具。下面将详细介绍这两个库以及如何在实际项目中使用...

    eclipse draw2d实例大全 源码

    eclipse draw2d实例大全 org.eclipse.draw2d.examples.cg org.eclipse.draw2d.examples.connections org.eclipse.draw2d.examples.graph org.eclipse.draw2d.examples.hittest org.eclipse.draw2d.examples.images ...

    Draw2d js图形库

    Draw2d.js是一个开源的JavaScript图形库,专为在Web应用程序中绘制和操作二维图形而设计。这个库特别适用于创建流程图、UML类图、网络拓扑图和其他复杂的图表。它提供了丰富的API和功能,使得开发人员可以轻松地创建...

    Java中如何使用Draw2D和SWT绘图

    在Java编程中,Draw2D库是一个强大的工具,它允许开发者使用SWT(Standard Widget Toolkit)来创建复杂的图形用户界面,特别适用于绘制图形和图表。Draw2D是Eclipse项目的一部分,它提供了一套丰富的API,可以方便地...

    在Java中使用Draw2D和SWT绘图的源码

    Java中的Draw2D和SWT(Standard Widget Toolkit)是两种强大的图形用户界面(GUI)工具,它们被广泛用于创建复杂的2D图形和可视化应用程序。在Java编程中,这两个库为开发者提供了丰富的功能,使得在屏幕上绘制高...

    draw2d 绘制图形教程

    《draw2d绘制图形教程详解》 在计算机编程领域,可视化和交互式界面设计是不可或缺的部分,而draw2d库正是这样一个专注于二维图形绘制的工具。draw2d库,全称为Draw2D,是一个开源的JavaScript库,它允许开发者在...

    Draw2d 教程 很详细

    Draw2d是一个强大的图形绘制库,常用于在Java环境中创建二维图形用户界面。这个"Draw2d教程"可能包含了从基础到高级的各种概念和技术,帮助学习者深入理解如何利用Draw2d来构建交互式图形应用。以下是教程可能涵盖的...

    Draw2d Programmer Guide

    ### Draw2D Programmer Guide #### 概览:整体框架 Draw2D是Eclipse平台下的一种轻量级图形用户界面工具包,它提供了一系列用于构建复杂图表、文档或绘图的功能组件,这些组件被称为“Figure”。不同于传统的GUI...

    Draw2d画线例子

    Draw2d是Eclipse RCP(Rich Client Platform)框架中的一个子项目,专门用于2D图形绘制和交互。它提供了一套丰富的API,允许开发者在Java应用程序中创建、编辑和展示复杂的图形界面,尤其适用于创建流程图、图表和...

    draw2d 示例代码

    《Eclipse Draw2D 示例代码解析》 Eclipse Draw2D 是一个强大的图形用户界面库,主要用于在Java环境中创建和管理2D图形。它作为Eclipse RCP( Rich Client Platform)的一部分,为开发者提供了丰富的图形绘制和交互...

    使用Draw2d做的流程图工具

    Draw2d是Java图形库Swing或 SWT中的一个子库,主要用于创建2D图形和复杂的图形用户界面,尤其适用于绘制流程图、图表和其他图形结构。它提供了丰富的图形绘制功能,如线条、形状、文本和图像的处理,以及交互式操作...

    swt总结draw2d绘图

    Draw2D是SWT中的一个子项目,专门用于在SWT组件上进行图形绘制,提供了一组丰富的API,使得开发者可以创建出复杂的2D图形用户界面。本总结将深入探讨SWT和Draw2D在绘图方面的知识。 1. SWT基础: SWT是一个与操作...

    Draw2D documents and samples

    《Draw2D技术详解与实例应用》 Draw2D,全称为Eclipse Draw2D,是Eclipse项目中的一部分,它提供了一套丰富的图形绘制和交互处理的API,主要用于在Java环境中创建2D图形用户界面。这个强大的工具库使得开发者能够...

    draw2d_Demo_code

    《draw2d_Demo_code——探索Draw2D图形库的应用》 在计算机编程领域,图形用户界面(GUI)是与用户交互的重要方式。Draw2D是Eclipse平台下的一个开源库,专门用于创建二维图形和复杂的图形布局。本文将深入探讨Draw...

    GEF/Draw2D入门例子

    **GEF/Draw2D入门教程** GEF(Graphical Editing Framework)和Draw2D是Eclipse项目中的两个核心组件,主要用于构建图形用户界面(GUI)特别是图形编辑工具。它们为开发者提供了强大的图形绘制和交互功能,使得创建...

    Draw2D UML Diagram

    《Draw2D UML Diagram——源码与工具的深度解析》 在软件开发过程中,UML(统一建模语言)图是一种重要的可视化工具,它帮助我们理解和表达系统的设计。Draw2D UML Diagram是一个用于创建UML类图的工具,通过源码...

    draw2d.js v2.9.1最新版本附带完整demo

    《draw2d.js v2.9.1:绘制工作流图的前端库解析与实践》 在当前数字化时代,工作流程图的可视化设计已经成为项目管理和协作的重要工具。Draw2D.js是一个专门用于创建和编辑二维图形的JavaScript库,特别适用于绘制...

    org.eclipse.draw2d.examples

    【标题】"org.eclipse.draw2d.examples" 是一个与Eclipse Draw2D相关的开发实例集合,主要用于展示和学习如何在Eclipse环境中使用Draw2D库进行图形界面编程。 【描述】提到的内容暗示了这个工程可能存在一定的兼容...

    Draw2d API (html版)

    Draw2d API Draw2d是一个宿主在SWT Composite控件中的轻量级的构件(widge)系统。一个Draw2d应用程序由一个 SWT Composite控件, 一个轻量级系统, 以及其内容(figures)组成。

Global site tag (gtag.js) - Google Analytics