八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  232 随笔 :: 0 文章 :: 3016 评论 :: 11 Trackbacks

其实可以放在任何Composite上,当然也就可以放在视图里了。关键任务是创建GraphicalViewer、RootEditPart、EditDomain和EditPartFactory这些对象,下面的代码是我从别处拷来的,稍微修改了一下。

public class TestView extends ViewPart {
ScrollingGraphicalViewer graphicalViewer;
FigureCanvas canvas;
Diagram diagram;
public void createPartControl(Composite parent) {
    graphicalViewer 
= new ScrollingGraphicalViewer();
    canvas 
= (FigureCanvas) graphicalViewer.createControl(parent);
    ScalableFreeformRootEditPart root 
= new ScalableFreeformRootEditPart();
    graphicalViewer.setRootEditPart(root);
    graphicalViewer.setEditDomain(
new EditDomain());
    graphicalViewer.setEditPartFactory(
new PartFactory());
    graphicalViewer.setContents(diagram);
}
}

运行结果如下,这个基本上只有视图的功能,也可以增加编辑功能,例如对GraphicalViewer加一个DropTargetListener就可以从调色板里拉对象上来了,等等。这个代码有点问题,就是打开View后要调整一下大小才能显示出图形,该怎么解决呢……

posted on 2005-10-21 20:26 八进制 阅读(4080) 评论(31)  编辑 收藏 所属分类: EclipseGEF

评论

#1楼 [楼主] 2005-10-28 13:43 八进制      
把ScalableFreeformRootEditPart换成ScalableRootEditPart后,问题似乎解决了。
  回复  引用  查看    

#2楼  2005-11-15 16:27 liketiger [未注册用户]
您好:如何实现gef中的GraphicalViewer和viewpart中的视图进行拖拽?
  回复  引用    

#3楼  2005-12-14 17:53 mercury [未注册用户]
您好,八进制,请问如何在EditPart中得到它所依赖的父窗口对象。比如,我现在想在GEF中点击某个NODE,能够弹出一个用SWT控件的窗口,例如最简单的 MessageBox,它需要得到父窗口(Shell类型)对象。我从哪里才能得到啊?
谢谢!
  回复  引用    

#4楼  2005-12-15 13:58 mercury [未注册用户]
呵呵,我知道了。
用Display.getDefault()得到当前的显示,然后将Shell加到它上面就可以了。

  回复  引用    

#5楼 [楼主] 2005-12-15 19:29 八进制      
我建议用yourEditPart.getViewer().getControl().getShell(),这是你的EditPart“对应”的Shell
  回复  引用  查看    

#6楼  2005-12-16 13:54 mercury [未注册用户]
你好,八进制,谢谢你的建议:)
请教一下这样做的好处是什么啊?我是个新手。

  回复  引用    

#7楼 [楼主] 2005-12-16 16:16 八进制      
请问你得到Display对象以后怎样得到shell呢,new Shell(display)?
  回复  引用  查看    

#8楼  2005-12-20 11:00 fangxq [未注册用户]
您好,如果我想单独建一个swt应用程序,使用gef,而不是作为elclipse插件项目,该如何建立呢?谢谢解答,急!yfangxq@hotmail.com
  回复  引用    

#9楼  2005-12-20 17:38 mercury [未注册用户]
八进制你好,我开始是想new Shell(display)来着,后来觉得太麻烦。就用VE做了一个shell(如 TestShell),然后,在捕获事件之后,new TestShell()就可以了,好像没有再用到Display对象了。
还需要请教斑竹一个问题,我想在MOVE结点的时候捕获这个事件后,将NODE的颜色变“黑”。我在performRequest中捕获了REQ_MOVE消息,进行处理,没起作用。后来,我又在propertyChange中监听PROP_LOCATION事件,然后设置该NODE的颜色为“黑”色。运行时,拖动NODE能够变黑了,但是,原来在显示时加的只能改变Y轴值(即只在纵向上可以移动)的限制不起作用了。
请问这是为什么啊?
非常感谢:)
  回复  引用    

#10楼  2005-12-20 18:51 mercury [未注册用户]
八进制,你好,真是不好意思,是我自己粗心出的错。

后来,我又对代码进行了修改,能够在拖动NODE时弹出SHELL了,你看看这种作法正确吗?如下:
1)在NodeEditPolicy中加入一个protected Command creatMoveCommand(ChangeBoundsRequest moveRequest)方法,在该方法内得到MoveNodeCommand,你的代码中已经实现了。
2)在NodePart的propertyChange中监听PROP_LOCATION,然后弹出SHELL界面,在refreshVisuals。

再次感谢:)
  回复  引用    

#11楼 [楼主] 2005-12-21 09:43 八进制      
不客气,因为时间和精力有限,有些问题无法详细研究,见谅!
  回复  引用  查看    

#12楼 [楼主] 2005-12-21 09:46 八进制      
To fangxq: 关于独立的gef应用程序,我没试过,只知道需要你自己实现相当多的工作,GEF FAQ上的说明:
“Can I develop a standalone GEF application without use of the Eclipse platform?

The official answer is No, this is not supported. The main reason involves the use of an Eclipse-specific file titled plugin.properties which GEF uses for string externalizations. However, since GEF is an open source project, modifications to the GEF codebase could potentially allow a GEF editor external to Eclipse.”
  回复  引用  查看    

#13楼  2006-03-28 21:49 zhou [未注册用户]
不知道八进制有没有做过,gef中的GraphicalViewer和viewpart中的视图进行拖拽呢?不知道八进制有没有什么建议,我是gef的新手,不是很懂。谢谢
  回复  引用    

#14楼  2006-03-29 15:44 suifongqi [未注册用户]
老大看了你的例子,了解了很多东西。但是如果我是使用鼠标右键增加一个图形到viewer里应该怎么做呢?如有办法,希望回复到我的邮箱suifongqi@126.com
真是非常感谢!
  回复  引用    

#15楼 [楼主] 2006-03-31 22:11 八进制      
增加的图形应该代表模型里的某个元素吧,一般是在右键菜单里增加一个action,这个action的run()方法会创建一个command,该command在模型里创建新的元素。如果你的editpart都配置正确(通知到了container editpart,从而调用它的refreshChildren()方法),这个新建的元素会立刻出现在viewer里。
  回复  引用  查看    

#16楼 [楼主] 2006-03-31 22:12 八进制      
zhou:你的意思是把viewpart里的图形拖到editor的viewer里吗?我没有试过,但应该不难实现,参考一下PaletteViewer里的元素是怎样拖到画布上的。
  回复  引用  查看    

#17楼  2006-04-05 19:28 zcx [未注册用户]
我在新作的一个FormEditor中
通过addPage()把一个我写好的GEFEditor加了进去。
//----------
geditor = new GEFEditor();
index = addPage((IEditorPart)geditor,getEditorInput()); setPageText(index, "Sequeces");
//-------------

由于原来完成的GEFEditor的contributorClass是一个ActionBarContributor
而现在的FormEditor的ContributorClass是一个MultiPageEditorActionBarContributor对象。
所以打开编辑器之后,原来在GEFEditor中可以动作的键盘删除等Action,现在全部都不能动作了。
问题出在哪里呢?
我该怎么改呢?
请指教!!!!!

  回复  引用    

@八进制
恩,是的,我要做的就是从其他视图拖放到我自己做的gef的viewpart里,主要是拖放的问题。我用的是swt.dnd的方法,但是现在存在的问题就是,我想要像palatteview实现的那样来传递模型的class,但是我现在看到的swt.dnd.transfer中只支持三种string的传递,不知道可不可以传递object。不知道你知不知道相关知识,谢谢了。
  回复  引用    

#19楼  2006-04-19 15:55 jljl [未注册用户]
八进制:你好
你知道eclipse里是否可以设置工具条,使工具条不仅在工具栏里,而且可以悬浮在界面上.就像.net中的工具条一样?
谢谢!
  回复  引用    

#20楼 [楼主] 2006-05-12 10:45 八进制      
To zhou: 通过传递Class的名称和对象的id属性是否可以达到传递object的目的?
To jljl: 好像不支持这种工具条,不知道利用view的detach功能是否可以间接实现……
  回复  引用  查看    

#21楼  2006-05-26 10:52 suifongqi [未注册用户]
@八进制
谢谢你的帮助,已经顺利完成。但是又有点小问题。现在我做的右键菜单无论选哪一种类型节点,都只能弹出相同的右键菜单。怎样能让它不同呢。
  回复  引用    

#22楼  2006-06-05 17:27 jljl [未注册用户]
有将gef放在viewpart里这部分的源码吗?我做的和这部分有类似的地方,谢谢!或发到我的email中:jia_ling_ling@sina.com
  回复  引用    

#23楼  2006-09-13 10:24 鬼谷子 [未注册用户]
老大:我想在定制编辑区域,比如将编辑区域设定为矩形,矩形外不能实现任何操作,该怎么做呢?
  回复  引用    

#24楼  2006-09-13 11:35 鬼谷子 [未注册用户]
编辑区域的大小设定好就不会再变化的。
  回复  引用    

#25楼 [楼主] 2006-09-13 13:50 八进制      
恐怕只能在你的editpart和editpolicy里做些文章了,据我所知gef没有提供这样的功能。
  回复  引用  查看    

#26楼  2006-09-14 14:37 鬼谷子 [未注册用户]
哦,谢谢指点~~
  回复  引用    

#27楼  2007-12-13 13:51 jiezi [未注册用户]
请问八进制大大,2个viewer(比如这个editor和视图)内部的图形要支持互相拖动,即从一个viewer拖到另一个viewer改怎么做,自己实现addDragSourceListener()和
addDropTargetListener()?但viewer的结构本身就不支持拖出自身范围
带面板的editor的编辑区和面板是2个viewer么?不知道怎么实现的
  回复  引用    

#28楼 [楼主] 2007-12-13 19:41 八进制      
我感觉也应该是addDragSourceListener()和addDropTargetListener()实现的,没实现过这个功能,你可以查看一下它们的代码。
  回复  引用  查看    

#29楼  2007-12-19 16:40 进城 [未注册用户]
parent.layout();
就可以解决拖拉下才显示的问题了
  回复  引用    

#30楼  2008-07-19 14:35 baby pig [未注册用户]
八进制 你好!
我做的右键菜单不论是在节点处还是在空白处都能显示相同的右键菜单 ,怎样让节点处显示 而空白处不显示菜单呢?
  回复  引用    

#31楼  2008-09-04 15:41 carolwyj [未注册用户]
非常感谢你的资料
可是我运行的时候报如下错误。能帮指点下么。
Exception in thread "main" java.lang.NoClassDefFoundError: com/ibm/icu/text/DecimalFormat
at org.eclipse.gef.editparts.ZoomManager.<init>(ZoomManager.java:92)
at org.eclipse.gef.editparts.ScalableRootEditPart.<init>(ScalableRootEditPart.java:143)
at org.eclipse.gef.ui.parts.GraphicalViewerImpl.createDefaultRoot(GraphicalViewerImpl.java:92)
at org.eclipse.gef.ui.parts.GraphicalViewerImpl.<init>(GraphicalViewerImpl.java:75)
at org.eclipse.gef.ui.parts.ScrollingGraphicalViewer.<init>(ScrollingGraphicalViewer.java:44)
at ui.composite.editor.TestView.createPartControl(TestView.java:19)
at ui.composite.EquipmentTab.createSashRightTop(EquipmentTab.java:95)
at ui.composite.EquipmentTab.createSashRight(EquipmentTab.java:83)
at ui.composite.EquipmentTab.createTabPage(EquipmentTab.java:45)
at ui.window.MyWindow.createContents(MyWindow.java:36)
at org.eclipse.jface.window.Window.create(Window.java:431)
at org.eclipse.jface.window.Window.open(Window.java:790)
at ui.window.TestClient.openWindow(TestClient.java:18)
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: