八进制

少年壮志无烟抽

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

在目前的GEF版本(3.1M6)里,可用的LayoutManager还不是很多,在新闻组里经常会看到要求增加更多布局的帖子,有人也提供了自己的实现,例如这个GridLayout,相当于SWT中GridLayout的Draw2D实现,等等。虽然可以肯定GEF的未来版本里会增加更多的布局供开发者使用(可能需要很长时间),然而目前要用GEF实现表格的操作还没有很直接的办法,这里说说我的做法,仅供参考。

实现表格的方法决定于模型的设计,初看来我们似乎应该有这些类:表格(Table)、行(Row)、列(Column)和单元格(Cell),每个模型对象对应一个EditPart,以及一个Figure,TablePart应该包含RowPart和ColumnPart,问题是RowFigure和ColumnFigure会产生交叉,想象一下你的表格该使用什么样的布局才能容纳它们?使用这样的模型并非不能实现(例如使用StackLayout),但我认为这样的模型需要做的额外工作会很多,所以我使用基于列的模型。

在我的表格模型里,只有三种对象:Table、Column和Cell,但Column有一个子类HeaderColumn表示第一列,同时Cell有一个子类HeaderCell表示位于第一列里的单元格,后面这两个类的作用主要是模拟实现对行的操作--把对行的操作都转换为对HeaderCell的操作。例如,创建一个新行转换为在第一列中增加一个新的单元格,当然在这同时我们要让程序给其余每一列同样增加一个单元格。

geftable.gif
图1 表格编辑器

现在的问题就是怎样让用户察觉不到我们是在对单元格而不是对行操作。需要修改的地方有这么几处:一是创建新行或改变行位置时显示与行宽一致的插入提示线,二是在用户点击位于第一列中的单元格(HeaderCell)时显示为整个行被选中,三是允许用户通过鼠标拖动改变行高度,最后是在改变行所在位置或大小的时候显示正确的回显(Feedback)图形。下面依次介绍它们的实现方法。

调整插入线的宽度

在我们的调色板里有一个Row工具项,代表表格中的一个行,它的作用是创建新的行。注意这个工具项的名字虽然叫Row,实际上用它创建的是一个HeaderCell对象,创建它的代码如下:

tool = new CombinedTemplateCreationEntry("Row", "Create a new Row", HeaderCell.class, new SimpleFactory(HeaderCell.class), CbmPlugin.getImageDescriptor(IConstants.IMG_ROW), null);

创建新行的方式是从调色板里拖动它到想要的位置。在拖动过程中,随着鼠标所在位置的变化,编辑器应该能显示一条直线,用来表示如果此时放开鼠标新行将插入的位置。由于这个工具代表的是一个单元格,所以缺省情况下GEF会显示一条与单元格长度相同的插入线,为了让用户感觉到是在插入行,我们必须改变插入线的宽度。具体的方法是在HeaderColumnPart的负责Layout的那个EditPolicy(继承FlowLayoutEditPolicy)中覆盖showLayoutTargetFeedback()方法,修改后的代码如下:

protected void showLayoutTargetFeedback(Request request) {
    super.showLayoutTargetFeedback(request);
    
// Expand feedback line's width
    Diagram diagram = (Diagram) getHost().getParent().getModel();
    Column column 
= (Column) getHost().getModel();
    Point p2 
= getLineFeedback().getPoints().getPoint(1);
    p2.x 
= p2.x + (diagram.getColumns().size() - 1* (column.getWidth() + IConstants.COLUMN_SPACING);
    getLineFeedback().setPoint(p2, 
1);
}

其中p2代表插入线中右边的那个点,我们将它的横坐标加上一个量即可增加这条线的长度,这个量和表格当前列的数目有关,和列间距也有关,计算的方法看上面的代码很清楚。这样修改后的效果如下图所示,拖动行到新的位置时也会使用同样的插入线。

insertline.gif
图2 与表格同宽的插入线

选中整个行

缺省情况下,鼠标点击一个单元格会在这个单元格四周产生一个黑色的边框,用来表示被选中的状态。为了让用户能选中整个行,要修改HeaderCell上的EditPolicy。在前面一篇帖子里已经专门讲过,单元格作为列的子元素,要修改它的EditPolicy就要在ColumnPart的EditPolicy的createChildEditPolicy()方法里返回自定义的EditPolicy,这里我返回的是自己实现的DragRowEditPolicy,它继承自GEF内置的ResizableEditPolicy类,它将被HeaderColumnPart加到子元素HeaderCellPart的EditPolicy列表。现在就来修改DragRowEditPolicy以实现整个行的选中。

首先要说明,在GEF里一个图形被选中时出现的黑边和控制点称为Handle,其中黑边称为MoveHandle,用于移动图形;而那些控制点称为ResizeHandle,用于改变图形的尺寸。要改变黑边的尺寸(由单元格的宽度扩展为整个表格的宽度),我们得继承MoveHandle并覆盖它的getLocator()方法,下面的代码是我的实现:

public class RowMoveHandle extends MoveHandle {
    
public RowMoveHandle(GraphicalEditPart owner, Locator loc) {
        super(owner, loc);
    }

    
public RowMoveHandle(GraphicalEditPart owner) {
        super(owner);
    }

    
//计算得到选中行所占的位置,传给MoveHandleLocator作为参考
    public Locator getLocator() {
        IFigure refFigure 
= new Figure();
        Rectangle rect
=((HeaderCellPart) getOwner()).getRowBound();
        translateToAbsolute(rect);
        refFigure.setBounds(rect);
        
return new MoveHandleLocator(refFigure);
    }

}

在getLocator()方法里,我们调用了HeaderCellPart的getRowBound()方法用于得到选中行的位置和尺寸,这个方法的代码如下(放在HeaderCellPart里是因为在Handle里通过getOwner()可以很容易得到EditPart对象),行尺寸的计算方法与前面插入线的情况类似:

public Rectangle getRowBound(){
    Rectangle rect 
= getFigure().getBounds().getCopy();
    Diagram diagram 
= (Diagram) getParent().getParent().getModel();
    Column column 
= (Column) getParent().getModel();
    rect.setSize(diagram.getColumns().size() 
* column.getWidth() + (diagram.getColumns().size() - 1* IConstants.COLUMN_SPACING, rect.getSize().height);
    
return rect;
}

有了这个RowMoveHandle,只要把它代替原来缺省的MoveHandle加到HeaderColumnCell上即可,具体的方法就是覆盖DragRowEditPolicy的createSelectionHandles()方法,ResizableEditPolicy对这个方法的缺省实现是加一个黑框和八个控制点,而我们要改成下面这样:

protected List createSelectionHandles() {
    List l 
= new ArrayList();
    
//四周的黑色边框
    l.add(new RowMoveHandle((GraphicalEditPart) getHost()));
    
//下方的控制点
    l.add(new RowResizeHandle((GraphicalEditPart) getHost(), PositionConstants.SOUTH));
    
return l;
}

代码里用到的RowResizeHandle类是控制点的自定义实现,在下面很快会讲到。现在,用户可以看到整个行被选中的效果了。

rowselection.gif
图3 选中整个行

改变行的高度

改变行高度比较自然的方式是让用户选中行后自由拖动下面的边。前面说过,GEF里的ResizeHandle具有调整图形尺寸的功能,美中不足的是ResizeHandle表现为黑色(或白色,非主选择时)的小方块,而我们希望它是一条线就好了,这样鼠标指针只要放在选中行的下边上就会变成改变尺寸的样子。这就需要我们实现刚才提到的RowResizeHandle类了,它是ResizeHandle的子类,代码如下:

public class RowResizeHandle extends ResizeHandle {
    
public RowResizeHandle(GraphicalEditPart owner, int direction) {
        super(owner, direction);
        
//改变控制点的尺寸,使之变成一条线
        setPreferredSize(new Dimension(((HeaderCellPart) owner).getRowBound().width, 2));
    }

    
public RowResizeHandle(GraphicalEditPart owner, Locator loc, Cursor c) {
        super(owner, loc, c);
    }

    
//缺省实现里控制点有描边,我们不需要,所以覆盖这个方法
    public void paintFigure(Graphics g) {
        Rectangle r 
= getBounds();
        g.setBackgroundColor(getFillColor());
        g.fillRectangle(r.x, r.y, r.width, r.height);
    }

    
//与前面RowMoveHandle类似,但返回RelativeHandleLocator以使线显示在图形下方
    public Locator getLocator() {
        IFigure refFigure 
= new Figure();
        Rectangle rect
=((HeaderCellPart) getOwner()).getRowBound();
        translateToAbsolute(rect);
        refFigure.setBounds(rect);
        
return new RelativeHandleLocator(refFigure, PositionConstants.SOUTH);
    }

    
//不论是否为主选择,都使用黑色填充
    protected Color getFillColor() {
        
return ColorConstants.black;
    }

}

这样,我们就把控制点拉成了控制线,因为它的位置与选择框(RowMoveHandle)的一部分重合,所以在界面上感觉不到它的存在,但用户可以通过它控制行的高度,见下图。

rowresize.gif
图4 改变行高的提示

正确的回显图形

我们知道,在拖动图形和改变图形尺寸的时候,GEF会显示一个"影图"(Ghost Shape)作为回显,也就是显示图形的新位置和尺寸信息。因为操作行时目标对象实际是单元格,所以在缺省情况下回显也是单元格的样子(宽度与列宽相同)。为此,在DragRowEditPolicy里要覆盖getInitialFeedbackBounds()方法,这个方法返回的Rectangle决定了鼠标开始拖动时回显图形的初始状态,见以下代码:

protected Rectangle getInitialFeedbackBounds() {
    
return ((HeaderCellPart) getHost()).getRowBound();
}

这时的回显见下图,在拖动行时也使用同样的回显。

rowfeedback.gif
图5 改变行高时的回显

经过上面的修改,对HeaderCell的操作在界面上已经完全表现为对表格行的操作了。这些操作的结果会转换为一些Command,包括CreateHeaderCellCommand(创建新行,你也可以命名为CreateRowCommand)、MoveHeaderCellCommand(移动行)、DeleteHeaderCellCommand(删除行)和ChangeHeaderCellHeightCommand(改变行高)等,在这些类里要对所有列执行同样的操作(例如改变HeaderCell的高度的同时改变同一行中其他单元格的高度),这样在界面上才能保持表格的外观,详细的代码没有必要贴在这里了。

P.S.曾经考虑过另一种实现表格的方法,就是模型里只有Table和Cell两种对象,然后自己写一个TableLayout负责单元格的布局。同样是因为修改的工作量相对比较大而没有采用,因为那样的话行和列都要使用自定义方式处理,而这篇贴子介绍的方法只关心行的处理就可以了。当然,这里说的也不是什么标准实现,不过效果还是不错的,而且确实可以实现,如果你有类似的需求可以作为参考。

posted on 2005-05-20 10:14 八进制 阅读(7363) 评论(48)  编辑 收藏 所属分类: EclipseGEF

评论

#1楼  2005-05-20 17:09 pwb [未注册用户]
八进制你好,我写了个RCP+GEF的程序,GEF是拷贝的eclipse网站上的ShapesDiagram代码,我实现了自己的IEditorInput--ShapesEditorInput。下面是ShapesEditor的SetInput方法:
protected void setInput(IEditorInput input) {
super.setInput(input);
ShapesEditorInput in = (ShapesEditorInput)input;
diagram = in.getModel();
}
和OpenEidtor
ShapesEditorInput shapesIn = new ShapesEditorInput();
shapesIn.setModel(new ShapesDiagram());
try {
configurer.getWindow().getActivePage().openEditor(shapesIn, ShapesEditor.ID);
}
其它我也将ide和ui的相关依赖项去掉了,但出现这个错误
java.lang.NoClassDefFoundError: org/eclipse/gef/ui/parts/GraphicalEditorWithFlyoutPalette
和 Unable to instantiate editor,unable to load class。

能给点建议么?谢谢了。
  回复  引用    

#2楼 [楼主] 2005-05-20 18:03 八进制      
找不到GraphicalEditorWithFlyoutPalette类,应该是plugin.xml里对依赖的定义缺少了<import plugin="org.eclipse.gef"/>,或者是GEF版本太旧,需要3.0以上。
  回复  引用  查看    

#3楼  2005-05-22 18:44 pwb [未注册用户]
谢谢解答,这是将RCP+GEF(ShapesDiagram)结合的例子的代码,贴在这里希望和我遇到相同问题的兄弟看到,用火狐浏览器打开https://bugs.eclipse.org/bugs/show_bug.cgi?id=91472

  回复  引用    

#4楼  2005-05-24 20:19 freegoldlu [未注册用户]
我现在需要在palette 里面 放置2个 元素 对应一个model但是要根据条件显示2个不同的figure
EClass eClass = null;
eClass = ACMPackage.eINSTANCE.getApplicationComponent();
combined = new CombinedTemplateCreationEntry(
"ApplicationComponent",
"Create a new ApplicationComponent",
eClass,
new EObjectTemplateCreationFactory(eClass),
ImageDescriptor.createFromURL(BlueprintMMEditPlugin.getPlugin().getBundle().getEntry("icons/full/obj16/ApplicationComponent.gif")),
ImageDescriptor.createFromURL(BlueprintMMEditPlugin.getPlugin().getBundle().getEntry("icons/full/obj16/ApplicationComponent.gif")));
entries.add(combined);
eClass = ACMPackage.eINSTANCE.getApplicationComponent();
combined = new CombinedTemplateCreationEntry(
"ApplicationComponentGroup",
"Create a new ApplicationComponentGroup",
eClass,
new EObjectTemplateCreationFactory(eClass),
ImageDescriptor.createFromURL(BlueprintMMEditPlugin.getPlugin().getBundle().getEntry("icons/full/obj16/ApplicationComponent.gif")),
ImageDescriptor.createFromURL(BlueprintMMEditPlugin.getPlugin().getBundle().getEntry("icons/full/obj16/ApplicationComponent.gif")));
entries.add(combined);
只是显示的label不同,我想在editpart 或policy中得到不同的label名字 (ApplicationComponent, applicationComponentGroup)我应该怎么写 ,谢谢高手帮我解答
今天debug了一天 头都大了 。。。

  回复  引用    

#5楼 [楼主] 2005-05-24 21:06 八进制      
我觉得有两个办法:
一个是建两个类都继承你现在的这个ApplicationComponent,对应两个editpart,问题就简单多了;
另一个是通过你的EObjectTemplateCreationFactory把label名字传给模型,比如给它的构造方法增加一个String类型的参数,在getNewObject()方法里把参数的值赋给模型实例。
  回复  引用  查看    

#6楼  2005-05-25 09:57 freegoldlu [未注册用户]
按照第2种方法 ,解决问题 非常感谢 :) 如果在policy 或 editpart中 想获得当前palette 中 被选中项的 label ,就是"ApplicationComponentGroup"

"ApplicationComponent" 这两个字符串 应该怎么写?
  回复  引用    

#7楼 [楼主] 2005-05-25 13:09 八进制      
试试EditPart.getViewer().getEditDomain().getActiveTool()
  回复  引用  查看    

#8楼  2005-07-11 17:08 陈哲 [未注册用户]
我的0Eclipse里边的程序的字体全是黑的,不知道再么回事,

特来请教高手 希望给于指导 谢谢
  回复  引用    

#9楼 [楼主] 2005-07-11 22:08 八进制      
不知道你用的是哪个版本的eclipse,到preferences的General->Appearence->Colors and Fonts里设置一下看看?
  回复  引用  查看    

#10楼  2005-08-01 16:21 Px [未注册用户]
浩哥这篇文章写得好,很透彻
  回复  引用    

#11楼  2005-08-17 11:03 新手 [未注册用户]
eclipse上的VE palette插件面板老是消失了看不到,在哪里可以再次打开显示它?希望能够得到楼上大侠们的帮助,谢谢!
  回复  引用    

#12楼 [楼主] 2005-08-17 12:51 八进制      
是否缩成一个竖条了,如果是按一下竖条上方的黑色三角就可以打开;另一种情况是在选项里隐藏了,试试window-show view里打开palette视图。我没用过VE,说的是一般GEF程序的情况。
  回复  引用  查看    

#13楼  2005-09-12 10:04 剑辉 [未注册用户]
请问:我在dependencies里头已经添加了org.eclipse.gef,而且plugin.xml里头已经<import plugin="org.eclipse.gef"/>,可是一旦我在项目中PDE Tools->Update Classpaths后,编译器就提示
The import org.eclipse.gef cannot be resolved CellDefinitionAction.java GefPractice/src/com/example/actions line 5 2005年9月12日 9:49:27
我每次都需要从项目build path里头,添加一个变量把这个包添加进来才可以编译成功,结果这样如果想通过export wizard生成插件就会出错,log日志里头提示说:
1. ERROR in D:\workshop\RMS backup\9yue4final\GefPractice\src\com\example\actions\CellDefinitionAction.java
(at line 5)
import org.eclipse.gef.ui.actions.SelectionAction;
^^^^^^^^^^^^^^^
The import org.eclipse.gef cannot be resolved
----------
这种情况到底是怎么回事啊?说明实际上gef包并没有被import进插件,可是事实上,我已经再dependencies里头加入了阿。
  回复  引用    

#14楼 [楼主] 2005-09-12 10:46 八进制      
这篇内容可能对你有帮助:
http://www.cnblogs.com/bjzhanghao/archive/2005/09/06/230759.html
  回复  引用  查看    

#15楼  2005-09-12 14:56 剑辉 [未注册用户]
我详细看了你的文章,并尝试作了些修改,发现问题还是没有解决,这个东西太讨厌了,尽管每次调试都可以调试,可是最终如果插件打包不了,就没有意义了。
1. ERROR in D:\workshop\workplace\GefPractice\src\com\example\actions\CellDefinitionAction.java
(at line 5)
import org.eclipse.gef.ui.actions.SelectionAction;
^^^^^^^^^^^^^^^
The import org.eclipse.gef cannot be resolved
----------
2. ERROR in D:\workshop\workplace\GefPractice\src\com\example\actions\CellDefinitionAction.java
(at line 18)
public class CellDefinitionAction extends SelectionAction{
^^^^^^^^^^^^^^^
SelectionAction cannot be resolved to a type
----------
109. ERROR in D:\workshop\workplace\GefPractice\src\com\example\commands\BendpointCommand.java
(at line 3)
import org.eclipse.draw2d.geometry.Dimension;
^^^^^^^^^^^^^^^^^^
The import org.eclipse.draw2d cannot be resolved
----------
主要还就是draw2d和gef打包的时候无法解析。而我的plugin和dependencies都设置进了这两个包。令我奇怪的一点,尽管每次我plugiin.xml和dependecies都设置好了gef, "update classpaths"后,"gef"包并不能添加进buildpath 里头的plugin dependencies里头去,每次我还要用添加elcipse_Home的扩展来加入,好奇怪的问题。不知道你有没有遇到过这样的问题?难道是eclipse做的gef插件都无法正常打包?
  回复  引用    

#16楼  2005-09-12 15:58 剑辉 [未注册用户]
八进制:我发现一个很奇特的现象,我按照之前说的设置,然后我在eclipse里头重新添加了两个空项目,然后把plugin里头的gef和draw2d这两个jar文件分别导入不同的项目,再对原先的插件项目进行插件导出,居然就可以了,把生成的插件再放到plugin目录里头,插件就可以使用了,这个非常神奇!我真不知道里面的道理是什么?凭什么显式的把gef和draw2d插件导出成一个项目,基于它的gef插件就可以成功生成。
  回复  引用    

#17楼 [楼主] 2005-09-12 16:02 八进制      
我刚才试验了一下,在eclipse31里可以导出gefpractice项目,你试试我刚放上去的这个gefpractice31版本。http://www.cnblogs.com/Files/bjzhanghao/gefpractice31.zip
  回复  引用  查看    

#18楼  2005-09-12 17:49 剑辉 [未注册用户]
我后来重新又用新的一个eclipse,你的和我的代码都可以导出,看来是我原先的eclipse有问题,sigh,原先运作一直很好,哪里晓得居然导出插件会有问题。用一个新的eclipse之后,问题就解决了。真的很感谢你,你的很多gef的文章都让我受益匪浅。
  回复  引用    

#19楼  2005-10-09 18:06 niles [未注册用户]
上面剑辉打包的问题,也困扰了我好几天,不解决真不爽。问题我不说了,反正是快搞死我了,快到了问候eclipse他妈的地步。
这个问题真是恶心,在Eclipse下好好的,打出来的product就是不行。郁闷。也看了楼主介绍的文章,还是不行。
抱着新版本问题可能解决的想法,一直从3.10,3.11,3.2依次下新版本,总算在3.2里面搞定了。感觉是一个爽字。
对于Eclipse,我只想说的是,Eclipse没有你想象的那么好,Swing也没有你想象的那么差。
  回复  引用    

#20楼  2006-04-14 10:36 huff [未注册用户]
可不可以在一个Editor中通过新建Diagram的方式构造另一个Editor,或者说要实现多个Editor的管理有何思路?
  回复  引用    

#21楼  2006-05-10 14:24 huff [未注册用户]
由于现在使用的Diagram没有边界的限制,
不知在何处设置Diagram的大小?
  回复  引用    

#22楼 [楼主] 2006-05-12 10:23 八进制      
To niles: 基本同意你的观点,现在很少用Swing了,很多东西越来越生疏,也就更不想用它了。
To huff: Diagram的边界取决于Diagram使用的Figure,一般是一个FreeformLayer,你可以试试普通的Layer。不太明白你说的多个Editor的管理。
  回复  引用  查看    

文章很棒。。

感觉GUI还是很麻烦的啊。。慢慢学了。
  回复  引用    

#24楼  2007-06-04 14:20 流子 [未注册用户]
hi.老八,你上面那个表格编辑器的源代码能否借我参考一下?谢谢啦!我的Email:allenj@hz.webex.com
  回复  引用    

#25楼  2007-07-30 18:33 begginer [未注册用户]
请问这一章的源代码能不能提供一下?
谢谢:)
里面的一些细节自己弄不懂,想看看八进制大哥的做法。
zhanglei07@sei.pku.edu.cn
  回复  引用    

#26楼 [楼主] 2007-07-30 21:31 八进制      
抱歉,这些用作公司项目,所以无法提供下载。
  回复  引用  查看    

#27楼  2007-07-30 22:06 begginer [未注册用户]
ibm不是总是倡导开源的么...

anyway, 谢谢八进制~~

我自己再研究研究吧:)
  回复  引用    

#28楼  2007-12-06 17:09 jiezi [未注册用户]
请问如果要固定一个FlowLayoutEditPolicy里的一个EditPart不让拖动,就是连feedback动画效果都屏蔽掉的话,该怎么实现
  回复  引用    

#29楼  2007-12-06 17:16 jiezi [未注册用户]
还有Figure里有类似SashForm的实现么?感觉用ResizableEditPolicy+ToolLayout的话,必须选中某个块,才能拖动,跟SashForm直接在分割线上拖动不太一样啊
  回复  引用    

#30楼 [楼主] 2007-12-06 17:19 八进制      
去掉父editpart的editpolicy,就不允许拖动了;sashform好像没有。
  回复  引用  查看    

#31楼  2007-12-06 17:33 jiezi [未注册用户]
哇,感谢大哥回复这么快
其实我有个需求是在一个Editor里实现一个类似SashForm的左右2块,在每部分里面画图,我尝试了用ToolbarLayout和ResizableEditPolicy来分块,但屏蔽掉Editor的
editpolicy,这2块之间的分割线就不能拖动来改变比例了.
但用FlowLayoutEditPolicy的话,又想让那2块不能拖动,而且不用选中某块得到焦点就能拖动分割线.而且上面
protected List createSelectionHandles() {
List l = new ArrayList();
//四周的黑色边框
l.add(new RowMoveHandle((GraphicalEditPart) getHost()));
//下方的控制点
l.add(new RowResizeHandle((GraphicalEditPart) getHost(), PositionConstants.SOUTH));
return l;
}
里只能加一个EAST方向,好像加EAST和WEST方向就会出错,用EAST_WEST也不行.
大哥有什么好点子么
  回复  引用    

#32楼  2007-12-27 17:26 tongxin [未注册用户]
我要实现在一个表格,想把单元格(长方体)放入一个RectangleFigure长方体中,或有更好的容器可以介绍么?
  回复  引用    

为了做电子表单模型管理,我使用GEF做了一个表格。我最终采用的模型就是表格和单元格,行、列只是一层逻辑,否则根本无法处理单元格的纵向或者横向合并问题;在表格中,我采用了GridLayout约束机制,管理其中的单元格子元素;在表格的策略中,我尝试了很多种,最终选用了FlowLayoutEditPolicy基础类,因为只有这个类,才能够更好地判断插入行、插入列、选择行、选择列的切入点(事后,发觉采用XYLayoutEditPolicy也可以,不过判断切入点时,要完全根据鼠标的位置来判断)。

目前完成的表格系统已经具备了常用表格的功能:
1、 增加行、列
2、 删除行、列
3、 合并/拆分单元格
4、 移动行/列
5、 表格边框、背景、行间距、列间距等属性修改
6、 单元格字体、背景等修改
7、 行列宽度、高度调整等
8、 修改单元格文字、单元格文字折行显示等

如果需要的朋友,可以和我联系。
  回复  引用    

#34楼  2008-01-07 09:43 jiezi [未注册用户]
楼上的大哥能给发一份么
bit506@163.com
跪谢ing
  回复  引用    

#35楼  2008-01-18 16:35 sundp [未注册用户]
八进制,您好!
我想改变MoveHandle的颜色有黑色变为透明和改变ResizeHandle的数量该如何操作?谢谢!
  回复  引用    

#36楼 [楼主] 2008-01-19 13:58 八进制      
在对应EditPart的NonResizableEditPolicy#createSelectionHandles()里修改
  回复  引用  查看    

#37楼  2008-01-23 11:42 scs [未注册用户]
to:任我行0
我现在也在做类似的一个项目。很想参考一下你的代码实现,给我发一份你的代码吧: wjscs@hotmail.com。谢谢了先。
  回复  引用    

#38楼  2008-01-23 13:12 scs [未注册用户]
To:八进制:
帮我指点一下我的项目接下来该怎么做下去吧:
项目如下:一个图形编辑器,里面含有BLOCK,BLOCK中含有任意NODE节点,NODE带有所属时间段的属性TIME,含有相同TIME值的NODE要求显示在表示该时间段的同一区域内,NODE与NODE间有连线,且NODE不能被拖出BLOCK。
问题:
1:我想用类似你表格中的行来表示不同的时间区域,但不知道如何实现。或者你是否有更好的设计?GMF自带的RULER有个GUIDE好像也可以用来区分不同区域,不知道是否可以定制。
2:我在BLOCK中用COMPARTMENT来包含NODES,但要求NODE不能被拖出COMPARTMENT,该限制如何实现呢?
3:COMPARTMENT我用的是FREEFORMLAYOUTEX,但初始显示时是按照STACKLAYOUT来显示的,但通过选择SELECT ALL ,ARRANGE ALL可以使BLOCK中的NODE按FREEFORMLAYOUTEX重新布局,不知道如何编程实现ARRANGE ALL的功能一开始就让它们达到这种布局效果呢?
期待您的答复。

  回复  引用    

To@任我行0

很想参考一下你的代码实现,能给我一份吗? kmxht@hotmail.com。谢谢。

  回复  引用    

很想参考一下你的代码实现,能给我一份吗? lcxu187@tom.com。谢谢。


  回复  引用    

#41楼  2008-05-30 15:31 wolfhml [未注册用户]
我也想参考一下你的代码实现,能否发给我一份,先多谢了。wolfhml2008@163.com
  回复  引用    

#42楼  2008-06-18 23:34 羽毛1 [未注册用户]
任我行0,想看看您的代码,发我一份,谢谢。
featherafeather@163.com
  回复  引用    

#43楼  2008-06-20 13:27 davyfeng [未注册用户]
八进制,你好!
之前给你留言不知怎么回事好像没有看到邮件,所以在这借问一下。
有个GEF 的问题向你请教一下,我在调试org.eclipse.gef.examples.shapes这个例子的plugin版本时,editor的pallete可以正常显示,但是不能从上面拖放图标到编辑区域生成图形,debug得到的错误提示是classDefNotFound,can not initiallize class org.eclipse.gef.examples.shapes.model.EllipticalShape,但是将它导出到jar中间似乎就没有这个问题,请问是怎么回事? 如果可以,麻烦给我回一份邮件…… 非常感谢!
  回复  引用    

#44楼  2008-07-03 15:01 miaookok [未注册用户]
to:任我行0
我现在也在做类似的一个项目。很想参考一下你的代码实现,给我发一份你的代码吧: miaookok@163.com。非常感谢!

  回复  引用    

#45楼 [楼主] 2008-07-11 22:59 八进制      
@davyfeng
看起来是版本不对造成的问题。
  回复  引用  查看    

to:任我行0
很想参考一下你的代码实现,能给我发一份吗?memo06@163.com 非常感谢
  回复  引用    

to:任我行0
很想参考一下你的代码实现,能给我发一份吗?zhqi_3094@126.com 非常感谢
  回复  引用    

#48楼  2008-09-02 14:53 godric [未注册用户]
@任我行0
你好!最近我也在做一个表格,请问能把你发给我一份吗?谢谢!godric.wu@gmail.com
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-09-23 16:03 编辑过


相关链接: