GEF常见问题4:非矩形图元

简介:

现在假设要把原来GefPractice例子里的矩形图元节点换成用椭圆形表示,都需要做哪些改动呢?很显然,首先要把原来继承RectangleFigure的NodeFigure类改为继承Ellipse:

public   class  NodeFigure  extends  Ellipse  /* RectangleFigure */ {
    
}

这样修改后可以看到编辑器中的图元已经变成椭圆形了。但如果用户点选一个图元,表示选中的边框(选择框)仍然是矩形的,如图1所示:


图1 椭圆形的节点和矩形选择框

如果觉得矩形的选择框不太协调,可以通过覆盖DiagramLayoutEditPolicy的createChildEditPolicy()方法修改。缺省情况下这个方法返回一个ResizableEditPolicy,我们要定义自己的子类(EllipseResizableEditPolicy)来替代它作为返回值。

EllipseResizableEditPolicy里需要覆盖ResizableEditPolicy的两个方法,createSelectionHandles()方法决定“控制柄”(ResizeHandle)和“选择框”(MoveHandle)的相关情况,我们的实现如下:

protected  List createSelectionHandles() {
    List list 
=   new  ArrayList();
    
// 添加选择框
    
// ResizableHandleKit.addMoveHandle((GraphicalEditPart) getHost(), list);
    list.add( new  MoveHandle((GraphicalEditPart) getHost()) {
        
protected   void  initialize() {
            
super .initialize();
            setBorder(
new  LineBorder( 1 ) {
                
public   void  paint(IFigure figure, Graphics graphics, Insets insets) {
                    tempRect.setBounds(getPaintRectangle(figure, insets));
                    
if  (getWidth()  %   2   ==   1 ) {
                        tempRect.width
-- ;
                        tempRect.height
-- ;
                    }
                    tempRect.shrink(getWidth() 
/   2 , getWidth()  /   2 );
                    graphics.setLineWidth(getWidth());
                    
if  (getColor()  !=   null )
                        graphics.setForegroundColor(getColor());
                    
// 用椭圆形替代矩形
                    
// graphics.drawRectangle(tempRect);
                    graphics.drawOval(tempRect);
                }
            });
        }
    });
    
    
// 添加控制柄
    ResizableHandleKit.addHandle((GraphicalEditPart) getHost(), list, PositionConstants.EAST);
    ResizableHandleKit.addHandle((GraphicalEditPart) getHost(), list, PositionConstants.SOUTH);
    ResizableHandleKit.addHandle((GraphicalEditPart) getHost(), list, PositionConstants.WEST);
    ResizableHandleKit.addHandle((GraphicalEditPart) getHost(), list, PositionConstants.NORTH);
    
return  list;
}

createDragSourceFeedbackFigure()方法决定用户拖动图形时,随鼠标移动的半透明图形(即“鬼影”)的形状和颜色,因此我们覆盖这个方法以显示椭圆形的鬼影。

protected  IFigure createDragSourceFeedbackFigure() {
    
// 用椭圆替代矩形
    
// RectangleFigure r = new RectangleFigure();
    Ellipse r  =   new  Ellipse();
    FigureUtilities.makeGhostShape(r);
    r.setLineStyle(Graphics.LINE_DOT);
    r.setForegroundColor(ColorConstants.white);
    r.setBounds(getInitialFeedbackBounds());
    addFeedback(r);
    
return  r;
}

经过以上这些修改,可以看到选择框和鬼影都是椭圆的了,如图2所示。


图2 与节点形状相同的选择框和鬼影

点此下载工程,此工程修改自GEF应用实例中的GefPractice,目标文件的扩展名改为.gefpracticeel。

本文转自博客园xingoo的博客,原文链接:GEF常见问题4:非矩形图元,如需转载请自行联系原博主。

相关文章
|
1月前
|
C++
SDL基础使用01( 项目创建,绘制矩形)
在Visual Studio中创建SDL项目、集成SDL库、绘制矩形的步骤和代码示例。
34 2
SDL基础使用01( 项目创建,绘制矩形)
|
1月前
|
开发框架 前端开发 定位技术
在Mars3d实现cesium的ImageryLayer自定义瓦片的层级与原点
通过上述步骤,您可以成功在Mars3D平台上集成Cesium,并实现自定义瓦片图层的层级与原点配置。这一过程不仅提升了地图应用的定制化程度,也为处理特定数据集和优化用户体验提供了灵活的解决方案。在实际开发过程中,不断测试和微调是确保图层展示效果与性能的关键。
107 0
|
3月前
|
定位技术
TileMap系列使用(2)——瓦片调色板工具使用
TileMap系列使用(2)——瓦片调色板工具使用
67 6
|
4月前
|
前端开发
Canvas添加了橡皮擦工具的画板项目和只能画圆的源码
Canvas添加了橡皮擦工具的画板项目和只能画圆的源码
|
Java 图形学
JavaSwing矩形绘制教程
JavaSwing矩形绘制教程 矩形是计算机图形学中最基本的图形,JavaSwing也提供了绘制矩形的功能。本教程将介绍如何使用JavaSwing绘制矩形。
199 0
|
编译器 API 图形学
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
154 0
|
定位技术
Threejs使用Shapes实现不规则几何体,自定义绘图
Threejs使用Shapes实现不规则几何体,自定义绘图
1031 0
Threejs使用Shapes实现不规则几何体,自定义绘图
|
计算机视觉
Qt实用技巧:图形视图框架中图元将矩形边界改为不规则边界(用于选取和碰撞)
Qt实用技巧:图形视图框架中图元将矩形边界改为不规则边界(用于选取和碰撞)
Qt实用技巧:图形视图框架中图元将矩形边界改为不规则边界(用于选取和碰撞)
SwiftUI—通过Path路径绘制不规则的线条和图形
SwiftUI—通过Path路径绘制不规则的线条和图形
643 0
SwiftUI—通过Path路径绘制不规则的线条和图形
openlayers之绘制矩形星星拉框放大自定义图形
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gisdoer/article/details/83036414 简介:openlayers绘制矩形、星星、拉框绘制,以及自定义图形。
1623 0