1

我有这段代码,它应该在释放鼠标按钮时移动一些像素:

if (selected != -1) {
    Point to = e.getPoint();
    int dx = start.x - to.x;
    int dy = start.y - to.y;
    for (Point p: store.get(selected)) {
        int px = (int) p.getX();
        int py = (int) p.getY();
        p.move(px - dx, py - dy);
    }

    validate();

调试器的使用表明点 p 确实获得了新值,但视觉效果没有得到更新。请帮帮我。

下面是我的程序的全部代码。

public class Pisi extends JFrame implements MouseMotionListener, MouseListener {
ArrayList<ArrayList<Point>> store = new ArrayList<ArrayList<Point>>();
ArrayList<Point> pts = new ArrayList<Point>();
Point start;
static int xsize = 450;
static int ysize = 300;
int listNumber = 0;
int selected = -1;



public static void main(String[] args) {
    Pisi d = new Pisi();
    d.setSize(xsize, ysize);
    d.setLocationRelativeTo(null);
    d.addMouseMotionListener(d);
    d.addMouseListener(d);
    d.setResizable(false);
    d.setVisible(true);
}

@Override
public void update(Graphics g) {
    paint(g);
}
@Override
public void paint(Graphics g) {
    Point last = null;

    for (Point p : pts) {

        if (last == null) {
            last = p;
            continue;
        }
        g.drawLine(last.x, last.y, p.x, p.y);
        last = p;
    }
}

@Override
public void mouseDragged(MouseEvent e) {

    if (e.getButton() == MouseEvent.BUTTON1) {
        pts.add(e.getPoint());
        repaint();
    }

}

@Override
public void mouseMoved(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mouseClicked(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mousePressed(MouseEvent e) {
    Point point = e.getPoint();
    start = null;
    selected = -1;
    for (ArrayList<Point> points: store) {
        for (Point p : points) {
            double dist = point.distanceSq(p);
            if (dist < 10) {
                selected = store.indexOf(points);
            }
        }
    }
    if (selected != -1) {
        start = e.getPoint();
    }
    System.out.println(selected);
}


@Override
public void mouseReleased(MouseEvent e) {
    if (selected != -1) {
        Point to = e.getPoint();
        int dx = start.x - to.x;
        int dy = start.y - to.y;
        for (Point p: store.get(selected)) {
            int px = (int) p.getX();
            int py = (int) p.getY();
            p.move(px - dx, py - dy);
        }

        validate();
    } else if (e.getButton() == MouseEvent.BUTTON1 && pts.size() != 0) {
        store.add(new ArrayList<Point>(listNumber));
        for (int i = 0; i < pts.size(); i++) {
            store.get(listNumber).add(pts.get(i));
        }
        listNumber++;
    }
    pts.clear();

}

@Override
public void mouseEntered(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mouseExited(MouseEvent mouseEvent) {
    //To change body of implemented methods use File | Settings | File Templates.
}
}
4

2 回答 2

4

我会推荐:

  • 首先,您在paintComponent(...)JPanel 的方法中绘制,而不是直接在paint(...)JFrame 的方法中绘制。这将使您能够访问 Swing 的自动双缓冲,并防止您弄乱 JFrame 的任何子项或边框的图形。
  • 与其使用 anArrayList<Point>和 an ArrayList<ArrayList<Point>>,不如使用 Path2D 和 an ArrayList<Path2D>
  • 您将您的`paintComponent's Graphics 对象转换为 Graphics2D 对象
  • 您使用此 Graphics2D 对象使用此draw(Shape s)方法绘制您的 Path2D 对象。
  • 您使用 Path2Dcontains(...)方法查看鼠标按下是否发生在您持有的 Path2D 对象上List<Path2D>
  • 如果选择了 Path2D,您可以使用 AffineTransform 通过变换方法移动它。

编辑:
不,contains(...)不会起作用,因为如果在 Path2D 勾勒的凹形区域中按下鼠标,这是真的。进一步研究这个...

编辑 2:
解决此问题的一种方法是使用 PathIterator 遍历您的 Path2D,以查看您的 mousePress 是否靠近构成 Path2D 的任何线段。

于 2013-01-12T22:20:37.617 回答
0

我建议你先尝试validate()方法(Container类的方法)

注意: 关于 validate() 方法的信息

如果 validate()方法不起作用,请尝试使用:

update()方法(调用paint()方法)或repaint()方法。

于 2013-01-12T21:20:33.443 回答