首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘图问题中的绘图矩形

绘图问题中的绘图矩形
EN

Stack Overflow用户
提问于 2012-05-10 05:36:18
回答 2查看 1.3K关注 0票数 1

我们正在为我们的项目创建一些图形应用程序。我们在我们的项目中使用了Draw2d和全球环境基金技术。我们必须在绘图区域画一个矩形。功能如下。

  1. 使用单击工具栏中的矩形按钮。
  2. 将光标更改为交叉curson符号。
  3. 当用户单击该区域并拖动鼠标时,它将显示基于鼠标拖动的矩形。

到目前为止,一切都很顺利。现在的问题是,我们有放大和缩小功能。当使用缩放和绘制矩形时,它不会出现在所需的位置。下面是area.Then用户必须滚动并查看矩形的部分内容。这个问题只有当我们使用放大和缩小时才会发生。

如何重新解决这个问题?请看下面的代码。

代码语言:javascript
复制
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) {


    }

}
EN

回答 2

Stack Overflow用户

发布于 2012-05-10 12:32:23

您需要根据缩放管理器当前使用的缩放级别缩放鼠标事件坐标。鼠标事件是绝对像素,但是您的ZoomManger会导致将缩放因子应用到图形的坐标上。我认为你也需要考虑到你的视点的客户区域。

首先,当您构建ZoomManager时,从FigureCanvas传入ViewPort:

代码语言:javascript
复制
zoomManager = new ZoomManager(root, figureCanvas.getViewPort());

然后尝试这样的方法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-12 17:01:14

您必须将从鼠标事件获得的绝对坐标转换为相对坐标到person图形的父级:

代码语言:javascript
复制
@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帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10528080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档