如何使用MouseListener移动不同的形状

问题描述 投票:0回答:2

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

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MyShapes extends JPanel {
private Point2D.Float position;

private final DifferentShapes[] shapes = new DifferentShapes[]{new Circle(), new Triangle(), new Square()};

MovingAdapter ma = new MovingAdapter();

    public MyShapes() {
        addMouseMotionListener(ma);
        addMouseListener(ma);
    }

    interface DifferentShapes {
        void paint(Graphics2D graphics);
        boolean contains(int x, int y);
        void move(int dx, int dy);
}

@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D graphics = (Graphics2D) g;
    for (DifferentShapes shape : this.shapes) {
        shape.paint(graphics);
    }
}

移动适配器类

  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() 方法

java swing awt
2个回答
0
投票

逻辑是正确的,你正确地改变了坐标。您只需调用

repaint()
即可显示更改。

if (shape.contains(x, y)) {
   shape.move(dx, dy);
   repaint();
}

0
投票
                double x = 0, y = 0, dx = 0, dy = 0;
                for(Node n: selectedList) 
                {
                    x += n.getLayoutX();
                    y += n.getLayoutY();
                }
                dx = e.getX() - x / selectedList.size();
                dy = e.getY() - y / selectedList.size();
                for (Node n : selectedList) 
                {
                    n.setTranslateX(dx);
                    n.setTranslateY(dy);
                }
© www.soinside.com 2019 - 2024. All rights reserved.