锁定老帖子 主题:利用GEF制作表格系统(控制器设计)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-27
控制器设计 通用模型我们可以简单抽取一个控制器通用模型,实现监听器的注册和注销,其它控制器继承该控制器。 public class AbstractEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener{
//@Override public void activate(){ super.activate(); ((AbstractNode)getModel()).addPropertyChangeListener(this); //System.out.println("activate"); } //@Override public void deactivate(){ super.deactivate(); ((AbstractNode)getModel()).removePropertyChange(this); //System.out.println("deactivate"); }
//@Override protected IFigure createFigure() { // TODO Auto-generated method stub return null; } //@Override protected void createEditPolicies() { // TODO Auto-generated method stub } public void propertyChange(PropertyChangeEvent evt) { // TODO Auto-generated method stub
} } 表格控制器设计表格的控制器虽然比较复杂,但是也理解其机制,也不是特别复杂。重要的是要考虑表格中含有子元素,所以要注意:供子元素列表获取;子元素画板获取;素发生变化时,在刷新视图的显示、刷新子元素列表;安装相应的策略等。 public class FormTableEditPart extends AbstractEditPart{
protected IFigure createFigure() { return new TableFigure((TableNode)getModel()); }
public void refreshVisuals(){
Rectangle constraint = ((TableNode)getModel()).getConstraint();
if(constraint.width==-1 || constraint.height == -1){
constraint.width= ((TableNode)getModel()).getGrid().numColumns * 20+2;//((TableNode)getModel()).getWidthHint() constraint.height=((TableNode)getModel()).getHeightHint()*2+2; ((TableNode)getModel()).setConstraint(constraint); } ((GraphicalEditPart)getParent()).setLayoutConstraint(this, getFigure(), constraint);
}
public List getModelChildren(){
return ((TableNode)getModel()).getChildren(); } public void createEditPolicies(){ installEditPolicy(EditPolicy.CONTAINER_ROLE,new ContainerLayoutEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE,new FormDeleteEditPolicy()); } public IFigure getContentPane(){
return ((TableFigure)getFigure()).getContainerFigure(); }
public void propertyChange(PropertyChangeEvent event){ String prop=event.getPropertyName();
if(TableNode.P_CHILDREN.equals(prop)){ this.refreshChildren(); this.refreshVisuals(); }else if(prop.equals(TableNode.P_CONSTRAINT)){ refreshVisuals(); }else if(prop.equals(TableNode.P_CHILDCHANGE)){
refreshVisuals(); }else if(prop.equals(TableNode.P_GRIDMANAGER)){ String delta=(String)event.getNewValue(); test(delta); TableNode table=(TableNode)getModel(); Rectangle cons=TableTool.getTableConstraint(table); table.setConstraint(cons); }else if(prop.equals(TableNode.P_TABLEBGCOLOR)){ getFigure().setBackgroundColor(((TableNode)getModel()).getBgColor());
}
super.propertyChange(event); } public void test(String delta){ List list=this.getChildren(); IFigure parent=getContentPane(); String type=delta.split(":")[0]; int chgValue=Integer.parseInt(delta.split(":")[1]); GridLayout layout=((TableNode)getModel()).getGrid(); for(int i=0;i<list.size();i++){ CellEditPart part=(CellEditPart)list.get(i); GridData gridData=((CellNode)part.getModel()).getGridData(); if("vspace".equalsIgnoreCase(type)){ if(gridData.verticalSpan >1){ gridData.heightHint+=(gridData.verticalSpan-1)*chgValue; } }else if("hspace".equalsIgnoreCase(type)){ if(gridData.horizontalSpan >1){ gridData.widthHint+=(gridData.horizontalSpan-1)*chgValue; } }else{
} layout.setConstraint(part.getFigure(), gridData); } }
} 其它控制器其它控制器类似。 至此,控制器业基本完成。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-09
不知你的CellOperateAction在那里?
|
|
返回顶楼 | |
浏览 3090 次