2012-05-10 78 views
1

我们正在为我们的项目创建一些图形应用程序。我们在项目中使用Draw2d和GEF技术。我们必须在绘图区绘制一个矩形。功能如下。绘图中的矩形问题

  1. 使用单击工具栏上的矩形按钮。
  2. 将光标更改为十字光标符号。
  3. 当用户点击区域并拖动鼠标时,它会根据鼠标的拖动显示矩形。

直到现在它工作正常。现在的问题是,我们已经放大和缩小功能。 当使用放大和绘制矩形时,它不会到达所需的位置。 它正在区域的下方。然后用户必须滚动并看到矩形。只有当我们使用放大和缩小时,才会出现此问题。

如何解决这个问题?请参阅下面的代码。

package draw2dview; 

import org.eclipse.draw2d.ColorConstants; 
import org.eclipse.draw2d.FigureCanvas; 
import org.eclipse.draw2d.FreeformLayout; 
import org.eclipse.draw2d.FreeformViewport; 
import org.eclipse.draw2d.IFigure; 
import org.eclipse.draw2d.LightweightSystem; 
import org.eclipse.draw2d.MouseEvent; 
import org.eclipse.draw2d.MouseListener; 
import org.eclipse.draw2d.RectangleFigure; 
import org.eclipse.draw2d.ScalableFigure; 
import org.eclipse.draw2d.ScalableFreeformLayeredPane; 
import org.eclipse.draw2d.ToolbarLayout; 
import org.eclipse.draw2d.XYLayout; 
import org.eclipse.draw2d.geometry.Point; 
import org.eclipse.draw2d.geometry.Rectangle; 
import org.eclipse.gef.DefaultEditDomain; 
import org.eclipse.gef.EditDomain; 
import org.eclipse.gef.EditPart; 
import org.eclipse.gef.EditPartFactory; 
import org.eclipse.gef.GraphicalViewer; 
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; 
import org.eclipse.gef.editparts.ScalableRootEditPart; 
import org.eclipse.gef.editparts.ZoomManager; 
import org.eclipse.gef.ui.actions.ZoomInAction; 
import org.eclipse.gef.ui.actions.ZoomOutAction; 
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; 
import org.eclipse.jface.action.Action; 
import org.eclipse.jface.action.IToolBarManager; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.ui.IActionBars; 
import org.eclipse.ui.part.ViewPart; 

public class View extends ViewPart implements org.eclipse.swt.events.MouseListener { 
    public static final String ID = "draw2dview.view"; 



    private Action drawAction; 
    private ScalableFreeformLayeredPane root; 
    ScalableRootEditPart editPart = null ; 
    private XYLayout layout; 
    private ZoomManager zoomManager ; 

    EditDomain editDomain = new DefaultEditDomain(null); 
    GraphicalViewer graphicalViewer = new ScrollingGraphicalViewer(); 
    ScalableFreeformRootEditPart rootEditPart = new ScalableFreeformRootEditPart(); 



    private FigureCanvas createContents(Composite parent){ 



     root = new ScalableFreeformLayeredPane(); 
     zoomManager = new ZoomManager(root,new FreeformViewport()); 
     root.setFont(parent.getFont()); 
     //layout = new XYLayout(); 

     layout= new FreeformLayout(); 
     root.setLayoutManager(layout); 




     FigureCanvas figureCanvas = new FigureCanvas(parent,SWT.DOUBLE_BUFFERED); 
     figureCanvas.addMouseListener(this); 
     figureCanvas.setBackground(ColorConstants.white); 
     LightweightSystem lws = new LightweightSystem(figureCanvas); 
     lws.setContents(root); 
     return figureCanvas ; 

    } 




    private IFigure createPersonFigure() { 
     RectangleFigure rectangleFigure = new RectangleFigure(); 
     rectangleFigure.setBackgroundColor(ColorConstants.blue); 
     rectangleFigure.setLayoutManager(new ToolbarLayout()); 
     rectangleFigure.setPreferredSize(100, 100); 
     return rectangleFigure ; 
    } 




    /** 
    * This is a callback that will allow us to create the viewer and initialize 
    * it. 
    */ 
    public void createPartControl(Composite parent) { 

    /* graphicalViewer.createControl(parent); 
     editDomain.addViewer(graphicalViewer); 
     graphicalViewer.setRootEditPart(rootEditPart);*/ 

     createContents(parent); 
     createAction(); 
     contributeToActionBars(); 
    } 

    private void contributeToActionBars() { 
     IActionBars bars = getViewSite().getActionBars(); 

     addToToolBar(bars.getToolBarManager()); 
    } 


    private void addToToolBar(IToolBarManager toolBarManager2){ 
     toolBarManager2.add(drawAction); 
     toolBarManager2.add(new ZoomInAction(zoomManager)); 
     toolBarManager2.add(new ZoomOutAction(zoomManager)); 


    } 

    private void createAction() { 
     drawAction = new Action() { 
      public void run() { 
       System.out.println("execued.."); 


      } 
     }; 
     drawAction.setText("Draw"); 
     drawAction.setImageDescriptor(Activator.getImageDescriptor("icons/alt_window_16.gif")); 
    } 

    /** 
    * Passing the focus request to the viewer's control. 
    */ 
    public void setFocus() { 
    // viewer.getControl().setFocus(); 
    } 




    @Override 
    public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) { 


    } 




    @Override 
    public void mouseDown(org.eclipse.swt.events.MouseEvent e) { 

     System.out.println("inside..Mousedeown:: "+e.x+","+e.y); 
     IFigure personFigure = createPersonFigure();     
     root.add(personFigure); 
     layout.setConstraint(personFigure, new Rectangle(new Point(e.x,e.y),personFigure.getPreferredSize())); 
     //layout.setConstraint(personFigure, new Rectangle(new Point(e.x,e.y),personFigure.getPreferredSize())); 
    } 




    @Override 
    public void mouseUp(org.eclipse.swt.events.MouseEvent e) { 


    } 

} 
+0

的问题可能是由你实现了变焦的方式茎 - 你需要发布一些代码,如果你想有一个明确的答案 –

+0

您好感谢您的回复。我已经添加了代码。我已经使用GEF缩放管理器进行放大和缩小。 – Parameswaran

回答

0

您需要调整您的鼠标事件,根据目前的缩放管理是使用缩放级别的坐标。鼠标事件是绝对像素,但是您的ZoomManger会将缩放因子应用于您的图形坐标。我认为你还需要考虑你的ViewPort的客户区。

首先,当你constuct你ZoomManager在视口中通过从FigureCanvas:

zoomManager = new ZoomManager(root, figureCanvas.getViewPort()); 

然后尝试类似:

double scaleFactor = zoomManager.getZoom(); 
Rectangle r = figureCanvas.getViewport().getClientArea(); 
layout.setConstraint(personFigure, new Rectangle(new Point((e.x + r.x) * scaleFactor,(e.y + r.y) * scaleFactor),personFigure.getPreferredSize())); 

这可能需要调整,以得到它的权利,让我知道...

+0

不,它不工作。我可以收到你的电子邮件吗?我想问你一些疑惑!!!如果你不介意的话。 – Parameswaran

+0

我宁愿把它放在堆栈上。新代码是否改进了一些问题?现在至少现在必须以不同的方式被打破? –

0

您必须从鼠标事件获取的绝对坐标转换为相对坐标,转换为人物图形的父级:

@Override 
public void mouseDown(org.eclipse.swt.events.MouseEvent e) { 
    System.out.println("inside..Mousedeown:: "+e.x+","+e.y); 
    IFigure personFigure = createPersonFigure();     
    root.add(personFigure); 
    Point p = new PrecisionPoint(e.x,e.y); 
    personFigure.translateToRelative(p); 
    layout.setConstraint(personFigure, new Rectangle(p,personFigure.getPreferredSize())); 
} 

欲了解更多信息,看看draw2d help