新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 计算机科学论坛计算机技术与应用『 Java/Eclipse 』 → [转帖]GEF实践总结(三)简易数据库编辑器 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5812 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [转帖]GEF实践总结(三)简易数据库编辑器 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     hongjunli 帅哥哟,离线,有人找我吗?魔羯座1978-1-20
      
      
      威望:5
      头衔:为振兴论坛而努力!
      等级:研二(中了一篇WWWC Poster)(版主)
      文章:808
      积分:7964
      门派:IEEE.ORG.CN
      注册:2006/3/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hongjunli发送一个短消息 把hongjunli加入好友 查看hongjunli的个人资料 搜索hongjunli在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hongjunli的博客楼主
    发贴心情 [转帖]GEF实践总结(三)简易数据库编辑器


    关键字: gef实践 数据库编辑器
    一. 目标

    不基于GraphicalEditorWithPalette或GraphicalEditorWithFlyoutPalette,而是完全在ViewPart上,因为实际开发中用户很难接受GraphicalEditor呆板的界面风格。
    实现了一个简易的DataBase->Table->TableColumn的图像编辑器。
    在不停的增强功能的过程中,探索GEF。

    二. 修改GraphicalViewer

    Java代码
    FigureCanvas canvas = (FigureCanvas) graphicalViewer.getControl();   
    canvas.setBackground(ColorConstants.white);   
    canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);  

    FigureCanvas canvas = (FigureCanvas) graphicalViewer.getControl();
    canvas.setBackground(ColorConstants.white);
    canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);
    GraphicalViewer的最底层控件是FigureCanvas
    给FigureCanvas设置背景色,并一直显示滚动条

    三. 修改模型、添加EditPart、增加Figure

    四. Layout
    在这步引入了Layout的概念,和SWT中的Layout作用是一样的。

    Java代码
    public class DataBaseFigure extends FreeformLayer implements IBaseFigure<DataBaseModel> {   
    private DataBaseModel model;   
      
    public DataBaseFigure() {   
    this.setLayoutManager(new FreeformLayout());   
    this.setBorder(new LineBorder(1));   
    }  

    public class DataBaseFigure extends FreeformLayer implements IBaseFigure<DataBaseModel> {
    private DataBaseModel model;

    public DataBaseFigure() {
    this.setLayoutManager(new FreeformLayout());
    this.setBorder(new LineBorder(1));
    }
    继承于FreeformLayer,FreeformLayer是一种上下左右四个方向都可以扩展的Figure。
    使用的Layout是FreeformLayout,FreeformLayout实际上就是XYLayout,只是它在计算起始位置的时候都是(0,0)坐标

    Java代码
    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);   
    }  

    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);
    }
    为了代码简单,只继承于Figure,实际上可以继承于RectangleFigure。因为Table毕竟只显示是一个矩形。
    TableFigure内部的Layout是GridLayout。GridLayout应该是3.4后才出现的。上面的代码表示内部的子Figure排成一个列且列宽相等(别扭,其实是因为只有一个列),和SWT内一样。
    在GridLayout内创建子Figure在时设置坐标属性的时候,需要传递GridData对象,而不是Rectangle对象(XYLayout)。于是,我们修改了BaseEditPart的refreshVisual方法。代码如下:
    Java代码
    /**  
    * @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);   
    }   
    }  

    /**
    * @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的计算

    headerRect.getTopLeft();  获得左上的坐标
    bodyRect.crop(new Insets(21, 1, 1, 1)); crop 调整大小
    Point
    Point用来表示xy值的类,同时封装了一些好用的计算方法。

    getCopy() 得到拷贝后的新对象
    translate(1,1) 坐标移动
    Graphics
    Graphics就是在Draw2d中进行绘图的类。可以设置前景色setForegroundColor、背景色setBackgroundColor、画线drawLine、设置字体setFont、线条样式setLineStyle、填充一个矩形区域fillRectangle、画一个矩形drawRectangle、画文字drawText等操作。

    六. 启动,查看运行效果

    此主题相关图片如下:
    按此在新窗口浏览图片
    七. 总结

    效果还不错。而且,代码也尽量做到简单,到此还没出现EditPolicy、Command等。
    理解Layout
    基本的使用Graphics进行绘图的技巧
    懂得使用Rectangle和Point
    源代码如下附件所示:

    原文地址:http://lggege.javaeye.com/blog/464284


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/9/8 12:19:00
     
     GoogleAdSense魔羯座1978-1-20
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/27 19:37:50

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms