Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用MouseStener移动不同的形状_Java_Swing_Awt - Fatal编程技术网

Java 如何使用MouseStener移动不同的形状

Java 如何使用MouseStener移动不同的形状,java,swing,awt,Java,Swing,Awt,我有一个程序,可以绘制我放在ArrayList中的不同形状,它可以很好地使用形状进行迭代来绘制它们,但是我移动它们的方法不起作用。我的move()方法有问题吗 类移动适配器 public class MovingAdapter extends MouseAdapter { private int x; private int y; public void mousePressed(MouseEvent e) { x = e.getX();

我有一个程序,可以绘制我放在ArrayList中的不同形状,它可以很好地使用形状进行迭代来绘制它们,但是我移动它们的方法不起作用。我的move()方法有问题吗

类移动适配器

  public  class MovingAdapter extends MouseAdapter {

    private int x;
    private int y;

    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
    }

    public void mouseDragged(MouseEvent e) {
        final int dx = e.getX() - x;
        final int dy = e.getY() - y;

        for (DifferentShapes shape : shapes) {
            if (shape.contains(x, y)) {
                shape.move(dx, dy);
            }
        }
        x += dx;
        y += dy;
    }
}


public static void main(String[] args) {
    JFrame frame = new JFrame("Shapes World");
    MyShapes m = new MyShapes();
    m.setDoubleBuffered(true);
    frame.add(m);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
}
班级圈子

 class Circle implements MyShapes.DifferentShapes {

public Circle() {
}
public static Ellipse2D.Float myCr = new Ellipse2D.Float(10,10, 100, 100);

public void paint(Graphics2D graphics) {
    Graphics2D circle = (Graphics2D) graphics;

    circle.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    circle.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    circle.setColor(new Color(0, 0, 117));
    circle.fill(myCr);
}
@Override
public boolean contains(int x, int y) {
    if (myCr.contains(x, y)) {
    }
    return true;
}
public void move(int dx, int dy) {
    myCr.x += dx;
    myCr.y += dy;
}

}

当我使用常规if语句时,它工作正常,但在for循环和我的move()方法中不起作用

逻辑是正确的,您正确地更改了坐标。您只需调用
repaint()
,即可显示更改

if(形状包含(x,y)){
移动(dx,dy);
重新油漆();
}

逻辑正确,您正在正确更改坐标。您只需调用
repaint()
,即可显示更改

if(形状包含(x,y)){
移动(dx,dy);
重新油漆();
}

Heya mate。当将3个不同的类组合到同一个文件中时,很难判断代码中发生了什么。我首先建议重构代码,将类彼此分离开来,然后看看有什么不符合预期。使用标准调试实践检查传递到方法/循环中的值,并查看它们是否如您所期望的那样。好的,我将在
鼠标按下逻辑中执行此操作,您应该识别已单击的对象。然后在
mouseDragged
中移动该对象并重新绘制面板。然后在
mousererelease
中,将单击的对象变量重置为null。它是否也与for循环一起使用?识别对象?是的,您需要for循环来识别对象。关键是当按下鼠标时,只执行一次循环。当你拖动时,你不需要重复搜索。鼠标垫也是你在上一篇帖子中引用建议逻辑的地方:嘿,伙计。当将3个不同的类组合到同一个文件中时,很难判断代码中发生了什么。我首先建议重构代码,将类彼此分离开来,然后看看有什么不符合预期。使用标准调试实践检查传递到方法/循环中的值,并查看它们是否如您所期望的那样。好的,我将在
鼠标按下逻辑中执行此操作,您应该识别已单击的对象。然后在
mouseDragged
中移动该对象并重新绘制面板。然后在
mousererelease
中,将单击的对象变量重置为null。它是否也与for循环一起使用?识别对象?是的,您需要for循环来识别对象。关键是当按下鼠标时,只执行一次循环。当你拖动时,你不需要重复搜索。鼠标按下的地方也是你在上一篇帖子中引用建议的逻辑的地方:
 class Circle implements MyShapes.DifferentShapes {

public Circle() {
}
public static Ellipse2D.Float myCr = new Ellipse2D.Float(10,10, 100, 100);

public void paint(Graphics2D graphics) {
    Graphics2D circle = (Graphics2D) graphics;

    circle.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    circle.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    circle.setColor(new Color(0, 0, 117));
    circle.fill(myCr);
}
@Override
public boolean contains(int x, int y) {
    if (myCr.contains(x, y)) {
    }
    return true;
}
public void move(int dx, int dy) {
    myCr.x += dx;
    myCr.y += dy;
}

}