`

Draw2d入门系列(四、 UML的实现)

阅读更多
Draw2d可以通过图形和连线表示图的关系,本节将用实例介绍如何通过图形和连线绘制UML的关系图
表关系实例中药包苦熬表和列的UML图形(Figure),其中表和列又包含属性和方法子图形。
表和列之间要建立一个以对多的关系连线
package com.heming.table.editor.figure;

import org.eclipse.draw2d.AbstractBorder;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Insets;

/**
 * 方法和属性的图形
 * 
 * @author 何明
 * 
 */
public class CompartmentFigure extends Figure {

	public CompartmentFigure() {

		ToolbarLayout layout = new ToolbarLayout();
		layout.setMinorAlignment(ToolbarLayout.ALIGN_TOPLEFT);
		layout.setStretchMinorAxis(false);
		// 设置子图形的间距
		layout.setSpacing(2);
		// 设置布局管理器
		setLayoutManager(layout);
		// 设置图形的边框
		setBorder(new CompartmentFigureBorder());

	}

	// 图形的边框类
	public class CompartmentFigureBorder extends AbstractBorder {
		public Insets getInsets(IFigure figure) {
			return new Insets(1, 0, 0, 0);
		}

		// 重画图形的边框
		public void paint(IFigure figure, Graphics graphics, Insets insets) {
			graphics.drawLine(getPaintRectangle(figure, insets).getTopLeft(),
					tempRect.getTopRight());
		}
	}
}

package com.heming.table.editor.figure;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.swt.graphics.Color;

/**
 * UMLClassFigure是UML Class的图形,每个UMLClassFigure包含两个CompartmentFigure
 * @author 何明
 *
 */
public class UMLClassFigure extends Figure {

	public static Color classColor = new Color(null,255,255,206);
	//属性图形
	private CompartmentFigure attributeFigure = new CompartmentFigure();
	//子方法图形
	private CompartmentFigure methodFigure = new CompartmentFigure();
	
	
	public UMLClassFigure(Label name){
		
		ToolbarLayout layout = new ToolbarLayout();
		//设置布局管理器
		setLayoutManager(layout);
		//设置图形的边框
		setBorder(new LineBorder(ColorConstants.black,1));
		//设置背景色
		setBackgroundColor(classColor);
		//设置图形是否透明
		setOpaque(true);
		
		//添加名字的标签
		add(name);
		//添加属性的图形
		add(attributeFigure);
		//添加方法的图形
		add(methodFigure);
		
	}
	
	/**
	 * 得到属性图形
	 * @return
	 */
	public CompartmentFigure getAttributesCompartment(){
		
		return attributeFigure;
		
	}
	
	/**
	 * 得到子方法图形
	 * @return
	 */
	public CompartmentFigure getMethodsCompartment(){
		
		return methodFigure;
		
	}
	
}

package com.heming.table.editor.figure;

import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionEndpointLocator;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * 连线及测试类
 * 
 * @author 何明
 * 
 */
public class UMLClassFigureTest {

	public static void main(String args[]) {

		Display d = new Display();
		final Shell shell = new Shell(d);
		shell.setSize(400, 400);
		shell.setText("UMLClassFigure Test");

		LightweightSystem lws = new LightweightSystem(shell);
		// 新建底层的图形
		Figure contents = new Figure();
		// 新建底层图的布局方式为XYLaout
		XYLayout contentsLayout = new XYLayout();
		contents.setLayoutManager(contentsLayout);

		Font classFont = new Font(null, "Arial", 12, SWT.BOLD);
		// 添加表的现实文本及显示的图标
		Label classLabel1 = new Label("Table", new Image(d,
				UMLClassFigureTest.class.getResourceAsStream("class_obj.gif")));
		classLabel1.setFont(classFont);

		Label classLabel2 = new Label("Column", new Image(d,
				UMLClassFigureTest.class.getResourceAsStream("class_obj.gif")));
		classLabel2.setFont(classFont);

		// 新建表和列的图形
		final UMLClassFigure classFigure = new UMLClassFigure(classLabel1);
		final UMLClassFigure classFigure2 = new UMLClassFigure(classLabel2);

		// 添加属性的显示文本及显示图标
		Label attribute1 = new Label("columns:Column[]", new Image(d,
				UMLClassFigure.class
						.getResourceAsStream("field_private_obj.gif")));
		Label attribute2 = new Label("rows:Row[]", new Image(d,
				UMLClassFigure.class
						.getResourceAsStream("field_private_obj.gif")));
		Label attribute3 = new Label("columnID:int", new Image(d,
				UMLClassFigure.class
						.getResourceAsStream("field_private_obj.gif")));
		Label attribute4 = new Label("items:List", new Image(d,
				UMLClassFigure.class
						.getResourceAsStream("field_private_obj.gif")));

		// 添加方法和属性的标签
		classFigure.getAttributesCompartment().add(attribute1);
		classFigure.getAttributesCompartment().add(attribute2);
		classFigure2.getAttributesCompartment().add(attribute3);
		classFigure2.getAttributesCompartment().add(attribute4);

		Label method1 = new Label("getColumns():Column[]", new Image(d,
				UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
		Label method2 = new Label("getRows:Row[]", new Image(d,
				UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
		Label method3 = new Label("getColumnID():int", new Image(d,
				UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));
		Label method4 = new Label("getItems():List]", new Image(d,
				UMLClassFigure.class.getResourceAsStream("methpub_obj.gif")));

		classFigure.getMethodsCompartment().add(method1);
		classFigure.getMethodsCompartment().add(method2);
		classFigure2.getMethodsCompartment().add(method3);
		classFigure2.getMethodsCompartment().add(method4);

		contentsLayout
				.setConstraint(classFigure, new Rectangle(10, 10, -1, -1));
		contentsLayout.setConstraint(classFigure2, new Rectangle(200, 200, -1,
				-1));

		// 新建连线
		PolylineConnection c = new PolylineConnection();
		// 添加图形的锚点
		ChopboxAnchor sourceAnchor = new ChopboxAnchor(classFigure);
		ChopboxAnchor targetAnchor = new ChopboxAnchor(classFigure2);
		c.setSourceAnchor(sourceAnchor);
		c.setTargetAnchor(targetAnchor);

		// 添加连线的装饰器
		PolygonDecoration decoration = new PolygonDecoration();
		PointList decorationPointList = new PointList();
		decorationPointList.addPoint(0, 0);
		decorationPointList.addPoint(-2, 2);
		decorationPointList.addPoint(-4, 0);
		decorationPointList.addPoint(-2, -2);

		decoration.setTemplate(decorationPointList);
		c.setSourceDecoration(decoration);

		// 添加连线的Locator
		ConnectionEndpointLocator targetEndpointLocator = new ConnectionEndpointLocator(
				c, true);
		targetEndpointLocator.setVDistance(15);
		Label targetMultiplicityLabel = new Label("1..*");
		c.add(targetMultiplicityLabel, targetEndpointLocator);
		// 添加连线到Locator
		ConnectionEndpointLocator sourceEndpointLocator = new ConnectionEndpointLocator(
				c, false);
		sourceEndpointLocator.setVDistance(15);
		Label sourceMultiplicityLabel = new Label("1");
		c.add(sourceMultiplicityLabel, sourceEndpointLocator);
		// 添加连线到Locator
		ConnectionEndpointLocator relationshipLocator = new ConnectionEndpointLocator(
				c, true);
		relationshipLocator.setVDistance(10);
		relationshipLocator.setVDistance(-20);
		Label relationshipLabel = new Label("contains");
		c.add(relationshipLabel, relationshipLocator);

		// 把表、列和连线(即关系)添加到底层图形上
		contents.add(classFigure);
		contents.add(classFigure2);
		contents.add(c);

		lws.setContents(contents);
		shell.open();
		while (!shell.isDisposed())
			while (!d.readAndDispatch())
				d.sleep();

	}

}

2
0
分享到:
评论

相关推荐

    Draw2D UML Diagram

    Draw2D UML Diagram是一个用于创建UML类图的工具,通过源码驱动,能够帮助开发者高效地绘制出清晰、准确的类图,便于团队沟通和代码实现。本文将深入探讨Draw2D UML Diagram的使用,以及与其相关的源码解析。 首先...

    eclipse draw2d实例大全 源码

    eclipse draw2d实例大全 org.eclipse.draw2d.examples.cg org.eclipse.draw2d.examples.connections org.eclipse.draw2d.examples.graph ...org.eclipse.draw2d.examples.uml org.eclipse.draw2d.examples.zoom

    GEF/Draw2D入门例子

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

    用draw2d画uml图源码实例

    4. **使用流程**:开发者通常会首先定义UML元素的模型类,然后使用Draw2D创建对应的视图,通过GEF实现元素的交互逻辑。在运行时,用户可以通过鼠标操作在界面上添加、修改和删除元素,所有的变更都会反映在模型上。 ...

    Draw2D 使用例子

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

    Draw2d js图形库

    3. **事件处理**:Draw2d.js支持图形对象的点击、拖动等事件监听,使得开发人员可以轻松地实现图形的交互逻辑。 4. **布局算法**:内置的布局算法能够自动排列图形,例如树形布局、网格布局等,使得复杂图表的组织...

    Java中如何使用Draw2D和SWT绘图

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

    draw2d 绘制图形教程

    - **图形对象**:draw2d提供了一系列预定义的图形对象,如矩形、圆形、多边形等,同时支持自定义形状。 - **连接线**:可以创建和编辑复杂的连接线,支持箭头、曲线等样式,用于表示关系或流程。 - **事件处理**...

    Draw2D快速入门精简教程

    网上的Draw2D的参考资料实在是太少了,对于新手来说太不友好了,所以,我总结了一份只有10来页的PPT做为新手的快速入门教程。

    Draw2d 教程 很详细

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

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

    当Draw2D与SWT结合使用时,可以在SWT的窗口或控件上绘制Draw2D图形,实现高度定制化的可视化效果。 在“在Java中使用Draw2D和SWT绘图的源码”中,我们可以学习如何将这两个库整合起来,创建动态的、交互式的2D图形...

    Draw2d画线例子

    在"Draw2d画线例子"中,我们将探讨如何利用Draw2d库来实现动态地在屏幕上绘制曲线图形。 首先,要使用Draw2d,你需要在Eclipse环境中设置好项目依赖。确保你已经安装了Eclipse IDE,并且导入了相关的插件如GEF...

    swt总结draw2d绘图

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

    Draw2d Programmer Guide

    Draw2D是Eclipse平台下的一种轻量级图形用户界面工具包,它提供了一系列用于构建复杂图表、文档或绘图的功能组件,这些组件被称为“Figure”。不同于传统的GUI组件,Figure在操作系统级别上没有对应的资源,它们完全...

    draw2d 示例代码

    在提供的"org.eclipse.draw2d.examples"目录下,我们可以看到一系列示例代码,这些代码涵盖了Draw2d的主要功能和使用场景: 1. BasicShapesExample:展示了如何创建基本形状,如Rectangle、Ellipse、Line等,并对...

    使用Draw2d做的流程图工具

    Draw2d提供了一系列布局管理器,如StackLayout、TableLayout和FlowLayout,帮助自动调整图形元素的位置和大小,以适应不同场景的流程图布局需求。 4. **事件处理与交互**: 用户可以通过鼠标和键盘与流程图交互,...

    Draw2D documents and samples

    无论是开发桌面应用程序还是Web应用,Draw2D都能提供强大的图形绘制支持,使得开发者能够专注于业务逻辑,而不是底层的图形实现细节。 在深入研究Draw2D时,需要注意以下几个关键点: 1. **理解基本图形对象和属性...

    draw2d_Demo_code

    在代码中,我们可能会看到`IFigure`接口的实现,它是Draw2D中所有图形对象的基类。 2. **布局管理器**:在`Draw2DLayoutExample.java`中,布局管理器如`GridLayout`或`FlowLayout`被用来组织和调整图形对象的位置。...

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

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

    org.eclipse.draw2d.examples

    “draw2d”是Eclipse中用于2D图形绘制的库,而“examples”则意味着这个压缩包包含了一系列使用Draw2d的示例代码,用于教学和实践。 在【压缩包子文件的文件名称列表】中,我们看到只有一个条目 "org.eclipse.draw...

Global site tag (gtag.js) - Google Analytics