首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

GEF(gef入门系列附上载)里下上文菜单删除功能问答

2012-11-12 
GEF(gef入门系列附下载)里上下文菜单删除功能问答请问GEF里上下文菜单删除功能怎么实现?我以注册了上下文

GEF(gef入门系列附下载)里上下文菜单删除功能问答
请问GEF里上下文菜单删除功能怎么实现?
我以注册了上下文菜单 在要删除的EditPart里安装了ComponentEditPolicy的实现类 而且删除Command也实现了 但点击该图形时删除这项是灰的?发现没调用ComponentEditPolicy的实现类的createDeleteCommand()方法 请问我该怎么解决?


xuanhai 2006年07月04日 09:55
delete,redo,undo这几个不是GEF里已经实现了嘛


zhangbo198294 2006年07月04日 11:30
delete必须要策略支持? 我那个上下文菜单的DELTE项就是不能选择


zhangbo198294 2006年07月04日 17:30
求解啊!!!!!!!!!!!!!!!!!!


jbcode 2006年07月05日 09:31
我记得在MyContextMenuProvider里面实现下面的方法就行,不必注册在Editor类中.自定义的Action需要在Editor类的createActions()中注册。
public void buildContextMenu(IMenuManager menu) {
    action = actionRegistry.getAction(ActionFactory.DELETE.getId());
    if (action.isEnabled()) {
        menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
    }
}


yanghuan 2006年07月05日 11:08
我也碰到相同的问题了,按照4楼的方法好像不行啊。能再解释的详细些吗?多谢啊~~


zhangbo198294 2006年07月05日 11:33
public void buildContextMenu(IMenuManager menu) {
       GEFActionConstants.addStandardActionGroups(menu);
       IAction action = getAction(ActionFactory.UNDO.getId());
       action.setText("撤消");
       menu.appendToGroup(GEFActionConstants.GROUP_UNDO,action);
       action = getAction(ActionFactory.REDO.getId());
       action.setText("重做");
       menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
       action = getAction(ActionFactory.DELETE.getId());
       action.setText("删除");
       menu.appendToGroup(GEFActionConstants.GROUP_EDIT,action);
   }
   private IAction getAction(String actionId) {
       return actionRegistry.getAction(actionId);
   }
  
我已经实现了但还是不处理delete请求


zhangbo198294 2006年07月07日 16:21
郁闷啊 怎么GEF区的人气这么低啊 


zhangbo198294 2006年07月10日 20:50
up求解决办法!


vii779 2006年07月10日 21:56
你可以在在DelteAction
protected boolean calculateEnabled() {
   Command cmd = createDeleteCommand(getSelectedObjects());
   if (cmd == null)
       return false;
   return cmd.canExecute();
}




这个方法内部设个断点,跟踪调试一下是否创建了DeleteCommand

如果这个方法也不能被调用,你需要
buildContextMenu 的里面,调用一下action.isEnable()方法

大多数情况是没有创建cmd,有几种情况
1 getSelectedObjects() 返回的0个对象
2 你的editorpart可能没有安装合适的policy,你要跟踪调试,才能发新问题。


zhangbo198294 2006年07月11日 08:48
我没有DelteAction这个类?GEF不是自动提供了这种ACTIO吗?
action = getAction(ActionFactory.DELETE.getId());
    action.setText("删除");
    menu.appendToGroup(GEFActionConstants.GROUP_EDIT,action);
同过上面的方法得到DELETEACTION然后放到menu里


zhangbo198294 2006年07月11日 09:26
而且我在我的NODEPART里安装了继承ComponentEditPolicy的子类 


vii779 2006年07月11日 10:02
就是让你调试 GEF 提供的 DelteAction,以前开发的时候也碰到很多类似的问题,都是通过逐步调式才找到原因的。


zhangbo198294 2006年07月11日 10:02
我的NODEPART已经安装了对应的策略/**
    * 描述:创建编辑策略方法
    * */
   protected void createEditPolicies() {
       //安装ConnectionNodeEditPolicy 图形连接策略,处理连接请求
       this.installEditPolicy(EditPolicy.CONNECTION_ROLE,new ConnectionNodeEditPolicy());
       //安装WorkFlowComponentEditPolicy 流程组合编辑策略类,处理删除请求
       this.installEditPolicy(EditPolicy.COMPONENT_ROLE, new WorkFlowComponentEditPolicy());
   }


zhangbo198294 2006年07月11日 10:06
ublic class WorkFlowComponentEditPolicy extends ComponentEditPolicy {
  
   private static Logger logger = Logger.getLogger(WorkFlowComponentEditPolicy.class);
  
   public WorkFlowComponentEditPolicy(){}
  
   /**
    * 描述:创建删除命令对象方法
    * @param deleteRequest:组请求的对象
    * @return
    * */
   protected Command createDeleteCommand(GroupRequest deleteRequest) {
       logger.info("调用createDeleteCommand()方法");
       Object parent = getHost().getParent().getModel();
       Object child = getHost().getModel();
       if (parent instanceof WorkFlowModel){
           if(child instanceof ReadFileModel || child instanceof WriteFileModel || child instanceof StartModel || child instanceof EndModel) {
               logger.info("delete model");
               return new FigureDeleteCommand((WorkFlowModel)parent,(WorkFlowModel)child);
           }
       }
       return null;
   }
  
}

public class FigureDeleteCommand extends Command{
  
   private WorkFlowModel parent = null;
   private WorkFlowModel child = null;
  
   /**
    * 描述:构造方法
    * @param parent:父模型对象
    * @param child: 子模型对象
    * */
   public FigureDeleteCommand(WorkFlowModel parent,WorkFlowModel child){
       this.parent = parent;
       this.child = child;
   }
  
   /**
    * 描述:执行方法
    * */
   public void execute() {
       Assert.isNotNull(parent);
       Assert.isNotNull(child);
       parent.removeChildModel(child);  
    }
  
}

有人告诉我是什么原因 让我不能实现删除的功能吗?

热点排行