微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在for循环中侦听鼠标单击事件,并在以后的代码中使用该事件的坐标

我想做的是在我的其余代码中,让它等待并识别鼠标单击事件,然后能够在其余代码中使用该单击的坐标,而不仅仅是将其打印到屏幕上在点击时,我发现的所有其他示例都差不多。

我是Java的新手,这是我第一次创建接口,因此对于任何错误我都表示歉意,我将尽快修复它们。

不幸的是,由于我不知道如何完成我所要求的工作,因此我只能用一种伪代码来表示它,并在代码加上一些位,否则我不会在这里首先提出疑问。

edit:下面的注释说不要这样做,我理解这一点,但我确实需要能够使那些坐标在该代码区域中可用(比下面显示的时间长很多),因此,如果有人我可以通过其他任何方式实现这一目标,然后分享

正是在两个不同位置上的两次单击才能获得两个不同的坐标,然后进行操作,这确实使我感到困惑。

.....
for(int i = 0; i < 15; i++) {
    wait for mouse click;
    int x = x coordinate of mouse click;
    int y = y coordinate of mouse click;
    wait for mouse click;
    int x2 = x coordinate of second mouse click;
    int y2 = y coordinate of second mouse click;
    if (closestVertex(x,y) != closestVertex(x2,y2) && ! graph.isline(x,y,x2,y2)) {
        graph.insertLine(x,y2);
    }
}
.... etc...

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

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

还有一种常见的方法是如下更改MouseListener:

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

但是,对于此选项,是的,您可以打印坐标,但是我看不到我可以在mouseClicked函数之外使用坐标详细信息的方法

就让它等待动作发生而不仅仅是继续执行循环而言,我有两个想法。我曾考虑在其中添加一个while循环并使用wait()和Thread.sleep(100),但问题是我根本不知道该怎么说:

while(event hasn't occurred) {
    wait()
}
int x = x coordinate of mouse click;
int y = y coordinate of mouse click;
...etc

如果您有任何新想法,我可以尝试一下,我将不胜感激,就像我一直在经历的那样,我什至不知道google上有多少链接正在寻找使之可行的方法

解决方法

您需要更改程序的控制流,以使您的代码能够响应UI事件,而不是尝试运行UI本身。尝试这样的事情:

class MyStateMachine {
  int i = 0; // this is your loop index
  boolean waitingForSecondClick = false; // is the next click the first or second?
  int firstX; // coordinates of the first click
  int firstY;

  void receiveCoordinates(int x,int y) {
    if (waitingForSecondClick) { 
       if (closestvertex(....)) {
         // do your stuff
       }
       ++i;
       waitingForSecondClick = false;
    } else {
       firstX = x;
       firstY = y;
       waitingForSecondClick = true;
    }
  }

因此您的鼠标侦听器将变为:

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

对象第一次单击鼠标时,它只是将坐标保存在其实例变量中,并且记住,下次单击是“第二次单击”。下次单击时,它会同时使用两次单击来完成任务,递增i并开始寻找另一个“首次单击”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。