当前位置:Gxlcms > mysql > EclipseGEF常用技巧

EclipseGEF常用技巧

时间:2021-07-01 10:21:17 帮助过:80人阅读

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 1、大纲视图右键菜单项受editpart的createEditPolicies()方法影响。例如 :虽然右键菜单提供了删除选项,但只要相关的treeeditpart没有install ComponentEditPolicy,那么当鼠标打开该节点的右键菜单

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  1、大纲视图右键菜单项受editpart的createEditPolicies()方法影响。例如 :虽然右键菜单提供了删除选项,但只要相关的treeeditpart没有install ComponentEditPolicy,那么当鼠标打开该节点的右键菜单时,是不会看到“删除”项的。

  2、和1类似,有时候某些作为容器元素的对象不希望被用户选中,也是通过修改policy来实现的。具体如下:

  editpart实现

  public class BoardPart extends ContainerPart {

  protected void createEditPolicies() {

  super.createEditPolicies();

  installEditPolicy(EditPolicy.LAYOUT_ROLE, new BoardLayoutEditPolicy());

  }

  }

  policy实现

  public class BoardLayoutEditPolicy extends XYLayoutEditPolicy {

  ...

  protected Command createChangeConstraintCommand(EditPart child,

  Object constraint) {

  return null;

  }

  ...

  }

  从上面的代码可以看出,只要createChangeConstraintCommand()返回null,那么容器元素就不会被选中。

  3、如果一个或多个图元的属性校验出错,希望自动选中,那么考虑对界面元素进行校验,然后使用下面的方法:

  /**

  * 选中未做关联的显示框

  * @param errorEls 错误显示框ArrayList

  */

  private void selectErrors(ArrayList errorEls) {

  EditPartViewer viewer = getGraphicalViewer();

  viewer.deselectAll(); //去掉所有选择项

  EditPart last = null;

  for(ElementView element:errorEls) {

  EditPart editpart = (EditPart) viewer.getEditPartRegistry().get(element);

  viewer.appendSelection(editpart); //添加选择元素

  last = editpart;

  }

  viewer.reveal(last); //将最后选中元素放到窗口可视区域

  }

  4、退出编辑器时提示保存

  根据国际惯例,编辑器退出却未保存时,一般都会弹出对话框提示用户选择是否关闭编辑器。这时我首先想到的是覆盖父类的dispose()方法,判断未保存就返回而不退出。可实践证明,eclipse RCP并不支持这样做。经过一番探索得知,需要实现ISaveablePart2接口,在promptToSaveOnClose()添加处理。代码如下:

  @Override

  public int promptToSaveOnClose() {

  if(this.isDirty && !UIHelper.comfirm("关闭提示", title + "还未保存,确定退出?"))

  return ISaveablePart2.CANCEL;

  else

  return ISaveablePart2.NO;

  }

  5、鼠标拖动自动调用选择工具

  处理此问题要从画布元素的editpart类入手。第一步修改createFigure()方法:

  protected IFigure createFigure() {

  ...

  fig.setOpaque(true);

  return fig;

  }

  第二步覆盖getDragTracker()方法:

  public DragTracker getDragTracker(Request request) {

  if (request instanceof SelectionRequest &&

  ((SelectionRequest) request).getLastButtonPressed() == 3)

  {

  return new DeselectAllTracker(this);

  }

  return new MarqueeDragTracker();

  }

  两个方法配合使用,否则无法达到目的。

  6、如何通过editpart修改editor保存状态(不通过setDirty()实现)

  由于editpart类是拿不到editor引用的,故想通过调用editor.setDirty()是不可能的。在我的项目中,拖动一个图元是可以触发修改标记,但是拖动连线后editor就不能自动设为修改状态。通过一番研究发现,可以在editpart类中增加如下方法来实现:

  public void commit() {

  getViewer().getEditDomain().getCommandStack().execute(new Command(){});

  }

人气教程排行