GEF小技巧之设定GraphicalEditor中图元为选中状态

        我们也许会有这样的需求,类似于Powerdesigner那样,在左边的树上的表格点击鼠标右键,在弹出快捷菜单中点击“Find in Diagram”(在图中查找)的功能,说白了,就是实现鼠标点击某图元的效果。

        因为是在GEF框架中,是先用户修改界面,控制器捕获修改信息,用Command来修改模型,模型的改变才会使控制器来最终改变画面。

        假设我们要选择的GEF模型为TableGefModel,其对应的控制器为TableGefModelEditPart;

        在TableGefModel中添加两个常量属性来标记状态的改变:

 public static final String TABLE_SELECT = "table_select";// 选中标记
 public static final String TABLE_NONE_SELECT = "table_none_select";// 不选中标记

        再添加一个成员方法:

 /**
  * 设置图元是否被选中状态
  * @param selected
  */
 public void setSelected(boolean selected) {
  if(selected) {
   firePropertyListenerChange(TABLE_SELECT, null, null);
  } else {
   firePropertyListenerChange(TABLE_NONE_SELECT, null, null);
  }
 }

 

接着需要修改控制器TableGefModelEditPart中的刷新方法:

 @Override
 public void propertyChange(PropertyChangeEvent evt) {

       .... ....

// 选中某一个表格
   if(evt.getPropertyName().equals(TableGefModel.TABLE_SELECT)) {
//   setSelected(EditPart.SELECTED_PRIMARY);
//   setSelected(EditPart.SELECTED_PRIMARY);
   getFigure().requestFocus();
   getViewer().appendSelection(this);   
   
  // 取消某一个表格的选中状态 
  } else if(evt.getPropertyName().equals(TableGefModel.TABLE_NONE_SELECT)) {
   setSelected(EditPart.SELECTED_NONE);
  }

}

 

当然,我们在选中某图形前,还需要取消该GraphicalEditor中其他图元的选中状态,所以,在选中目标图元之前,需要取消该GraphicalEditor中的集合模型(DatabaseDiagramGefModel )中的所有子模型(TableGefModel)的选中状态,参考代码:

DatabaseDiagramGefModel databaseDiagramGefModel = databaseDiagramEditor.getDatabaseDiagramGefModel(); // 获取Editor中的集合模型
      List<AbstractGefModel> getModelList = databaseDiagramGefModel.getChildren(); // 获取集合模型中的所有子模型
      for(AbstractGefModel abstractGefModel : getModelList) {

       // 先设置该模型为不选中状态
       ((TableGefModel)abstractGefModel).setSelected(false);

 

       // 如果该模型是我们需要选中的模型,则设置为选中状态
       if(tableModel.equals(abstractGefModel.getDataObject())){
         ((TableGefModel)abstractGefModel).setSelected(true);
       }
      }
     

 

注意,我们在设置选中状态时,不能用setSelected(EditPart.SELECTED_PRIMARY);
或者setSelected(EditPart.SELECTED_PRIMARY);因为此操作并不会激活控制器对应的状态栏等。至于是什么原因,由于开发时间紧,没仔细研究,以后补充!

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值