一. 目标
二. 修改GraphicalViewer
FigureCanvas canvas = (FigureCanvas) graphicalViewer.getControl(); canvas.setBackground(ColorConstants.white); canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);
三. 修改模型、添加EditPart、增加Figure
略
四. Layout
在这步引入了Layout的概念,和SWT中的Layout作用是一样的。
public class DataBaseFigure extends FreeformLayer implements IBaseFigure<DataBaseModel> { private DataBaseModel model; public DataBaseFigure() { this.setLayoutManager(new FreeformLayout()); this.setBorder(new LineBorder(1)); }
public class TableFigure extends Figure implements IBaseFigure<TableModel> { private TableModel model; public TableFigure() { super(); this.setBorder(new MarginBorder(20, 0, 0, 0)); GridLayout layout = new GridLayout(1, true); this.setLayoutManager(layout); }
/** * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ protected void refreshVisuals() { BaseModel model = (BaseModel) getModel(); GraphicalEditPart parentEditPart = (GraphicalEditPart) getParent(); IFigure parentFigure = parentEditPart.getFigure(); LayoutManager parentLayout = parentFigure.getLayoutManager(); if (parentLayout == null || parentLayout instanceof XYLayout) { // ... } else if (parentLayout instanceof GridLayout) { GridData constraint = new GridData(model.getW(), model.getH()); parentEditPart.setLayoutConstraint(this, getFigure(), constraint); } }
五. 分析Figure的关键方法
setBorder(new LineBorder(1));
表示有线条的边框,线条宽为1。其实LineBorder还可以设置颜色的。
setBorder(new MarginBorder(20, 0, 0, 0));
表示是一个空白的边框,上面20像素不会被子Figure占用,子Figure的坐标计算从20像素下面作为起始点进行计算。
Rectangle
Rectangle用来表示xywh值的类,同时封装了一些好用的计算方法。
Rectangle headerRect = bounds.getCopy();
从一个Rectangle获得拷贝后的新的Rectangle对象,注意,不要轻易去修改Figure.getBounds()得到的Rectangle,需要计算的时候应该从bounds.getCopy()获得新的Rectangle对象再去计算。
Rectangle的计算
Point
Point用来表示xy值的类,同时封装了一些好用的计算方法。
Graphics
Graphics就是在Draw2d中进行绘图的类。可以设置前景色setForegroundColor、背景色setBackgroundColor、画线drawLine、设置字体setFont、线条样式setLineStyle、填充一个矩形区域fillRectangle、画一个矩形drawRectangle、画文字drawText等操作。
六. 启动,查看运行效果
七. 总结