gpt4 book ai didi

Java 6 : how to drag/move a line?

转载 作者:行者123 更新时间:2023-11-29 03:38:26 27 4
gpt4 key购买 nike

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

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.
}
}

最佳答案

我会推荐:

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

编辑:
不,contains(...)将不起作用,因为如果在 Path2D 勾勒出的凹形区域中按下鼠标,则会出现这种情况。进一步调查……

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

关于Java 6 : how to drag/move a line?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297990/

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