gpt4 book ai didi

Java自定义Path2D

转载 作者:行者123 更新时间:2023-12-01 11:45:29 31 4
gpt4 key购买 nike

我已经为我正在做的项目创建了一个自定义 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); code> 然后它就可以了,但我被告知我不应该这样做。

有什么想法为什么它不能按预期工作吗?

最佳答案

setCalliper() 直接调用 build 方法,该方法将新点附加到添加到 Path2D 的所有先前点 - 因此每次 mouseDragged 被称为更多的点被添加到 Path 中。尝试在调用 build() 之前调用 reset() (或者在调用 moveTo/lineTo 之前在构建方法中调用 Reset)。

关于Java自定义Path2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29173946/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com