【问题标题】:Java custom Path2DJava 自定义 Path2D
【发布时间】:2015-03-20 18:57:33
【问题描述】:

对于我正在做的项目,我创建了一个自定义 Path2D 类来在屏幕上绘制一个 H 形“卡尺”。我想拖动并最终调整屏幕上的卡尺大小。我已经成功设置了 Path2D,这样我就可以绘制卡尺了,代码如下所示:

  1. 声明和构造函数:

    public class Calliper extends Path2D.Double
    {
        // X and Y coordinates of all six points on Calliper
        double cX1, cX2, cX3, cX4, cX5, cX6;
        double cY1, cY2, cY3, cY4, cY5, cY6;
    
        // Width and Height
        double cWidth;
        double cHeight;
    
    public Calliper(double x, double y, double w, double h)
    {
    
        cWidth = w;
        cHeight = h;
        cX1 = x;
        cY1 = y;
        cX2 = x;
        cY2 = y + (h/2);
        cX3 = x;
        cY3 = y + h;
        cX4 = x + w;
        cY4 = y;
        cX5 = cX4;
        cY5 = cY4 + (h /2);
        cX6 = cX4;
        cY6 = cY4 + h;
    
        build();
    
    }
    
  2. build() 方法(用于绘制路径)和 setCalliper() 方法,用于重新定义坐标,或宽度、高度:

    private void build()
    {
    
        // Draw the path for the calliper
    
        moveTo(cX1, cY1);
        lineTo(cX2, cY2);
        lineTo(cX3, cY3);
        moveTo(cX2, cY2);
        lineTo(cX5, cY5);
        moveTo(cX4, cY4);
        lineTo(cX6, cY6);
    
    }
    
    public void setCalliper(double x, double y, double w, double h)
    {
        // Rebuild the calliper using different x,y coordinates, or 
        // different width/height
    
        cWidth = w;
        cHeight = h;
        cX1 = x;
        cY1 = y;
        cX2 = x;
        cY2 = y + (h/2);
        cX3 = x;
        cY3 = y + h;
        cX4 = x + w;
        cY4 = y;
        cX5 = cX4;
        cY5 = cY4 + (h /2);
        cX6 = cX4;
        cY6 = cY4 + h;
    
        build();
    }
    

我创建了一个类来在屏幕上绘制这个卡尺,它会这样做,但是如果我尝试在屏幕上拖动卡尺,它不会在我拖动时擦除原始形状,所以我得到一个很长的留下的形状痕迹。我以为我从 paintComponent(Graphics g) 方法中省略了 super.paintComponent(g),但即使在其中,代码仍然无法正常工作。

我的拖动方法是这样的:

@Override
public void mouseDragged(MouseEvent ev) 
{

    double mx = ev.getX();
    double my = ev.getY();

    if (dragging)
    {
        calX = mx - offsetX;
        calY = my - offsetY;

        cal = setCalliper(calX, calY, calW, calH);
        repaint();
    }

}

如果我将上面的cal = setCalliper(calX, calY, calW, calH); 行更改为cal = new Calliper(calX, calY, calW, calH);,那么它可以工作,但有人告诉我不应该这样做。

任何想法为什么它不能按预期工作?

【问题讨论】:

标签: java graphics drawing drag path-2d


【解决方案1】:

setCalliper() 直接调用 build 方法,该方法将新点附加到添加到 Path2D 的所有先前点上 - 因此每次调用 mouseDragged 时都会向路径中添加更多点。尝试在调用build() 之前调用reset()(或在调用moveTo/lineTo 之前在build 方法中调用reset)。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2014-08-21
    • 2011-01-22
    • 2011-09-14
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多