程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Eclipse GEF常用技巧

Eclipse GEF常用技巧

編輯:關於JAVA

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<ElementView> 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(){});
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved