java—在for循环中侦听鼠标单击事件,并在后面的代码中使用该事件的坐标

sauutmhj  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(550)

我想做的是在我的代码的其余部分中,让它等待并识别鼠标点击事件,然后能够在代码的其余部分使用该点击的坐标,而不是像我找到的几乎所有其他示例那样,在点击时将其打印到屏幕上。
我是java新手,这是我第一次做接口,所以我为任何错误道歉,我会尽快修复它们。
不幸的是,由于我不知道如何去做我所要求的事情,我只能用一种伪代码来表示它,否则我就不会在这里问了。
编辑:下面的评论说不要这样做,这我明白,但我真的需要能够得到这些坐标,以便在该地区的代码(这是一个比下面显示的长得多)使用,所以如果有任何人有任何替代方法,我可以实现,那么请分享。
在两个不同的位置点击两次,得到两个不同的坐标,然后进行操作,这才是真正让我抓狂的地方。

  1. .....
  2. for(int i = 0; i < 15; i++) {
  3. wait for mouse click;
  4. int x = x coordinate of mouse click;
  5. int y = y coordinate of mouse click;
  6. wait for mouse click;
  7. int x2 = x coordinate of second mouse click;
  8. int y2 = y coordinate of second mouse click;
  9. if (closestVertex(x,y) != closestVertex(x2,y2) && ! graph.isline(x,y,x2,y2)) {
  10. graph.insertLine(x,y,x2,y2);
  11. }
  12. }
  13. .... etc...

到目前为止,我所看到的解决方案涉及到查看指针在给定时刻的位置,但这并不仅仅是单击时的位置。这种解决方案如下所示:

  1. int x = MouseInfo.getPointerInfo().getLocation.x;
  2. int y = MouseInfo.getPointerInfo().getLocation.y;

另一种常见的方法是改变鼠标听筒,如下所示:

  1. @Override
  2. public void mouseClicked(MouseEvent e) {
  3. int x=e.getX();
  4. int y=e.getY();
  5. System.out.println(x+","+y);
  6. }

但是对于这个选项,是的,您可以打印坐标,但是我看不到一种方法可以像我所希望的那样使用mouseclicked函数之外的坐标细节。
至于让它等待动作发生,而不仅仅是继续循环,我有几个想法。我想在里面添加一个while循环,并使用wait()和thread.sleep(100),但问题是我不知道如何从本质上说:

  1. while(event hasn't occurred) {
  2. wait()
  3. }
  4. int x = x coordinate of mouse click;
  5. int y = y coordinate of mouse click;
  6. ...etc

如果你有任何新的想法,我可以尝试,我会非常感谢它,因为我已经通过我甚至不知道有多少在谷歌上寻找一个方法,使这项工作的链接。

6ju8rftf

6ju8rftf1#

您需要更改程序的控制流,以便代码响应ui事件,而不是试图运行ui本身。尝试以下操作:

  1. class MyStateMachine {
  2. int i = 0; // this is your loop index
  3. boolean waitingForSecondClick = false; // is the next click the first or second?
  4. int firstX; // coordinates of the first click
  5. int firstY;
  6. void receiveCoordinates(int x, int y) {
  7. if (waitingForSecondClick) {
  8. if (closestvertex(....)) {
  9. // do your stuff
  10. }
  11. ++i;
  12. waitingForSecondClick = false;
  13. } else {
  14. firstX = x;
  15. firstY = y;
  16. waitingForSecondClick = true;
  17. }
  18. }

所以你的鼠标监听变成:

  1. @Override
  2. public void mouseClicked(MouseEvent e) {
  3. stateMachine.receiveCoordinates(e.getX(), e.getY())
  4. }

对象第一次收到鼠标单击时,它只会将坐标保存在其示例变量中,并记住下一次单击是“第二次单击”。下一次单击它使用两次单击来执行任务,增量 i 开始寻找另一个“第一次点击”。

展开查看全部

相关问题