【发布时间】:2020-09-05 21:52:24
【问题描述】:
我想做的是在我的其余代码中等待并识别鼠标单击事件,然后能够在其余代码中使用该单击的坐标,而不仅仅是将其打印到屏幕上就像我发现的几乎所有其他示例一样,单击时。
我是 java 新手,这是我第一次制作接口,所以我对任何错误深表歉意,我会尽快修复它们。
不幸的是,由于我不知道如何做我所要求的,我只能用一种带有代码位的伪代码来表示它,否则我一开始就不会在这里问。
编辑:下面的评论说不要这样做,我理解,但我真的需要能够让这些坐标在该代码区域中可用(这比下面显示的要长得多)所以如果有人有请分享我可以实现的任何替代方法。
在两个不同的位置单击两次以获得两个不同的坐标然后进行操作,这真的让我很震惊。
.....
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,y,x2,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
如果您有任何新的想法我可以尝试,我将不胜感激,因为我什至不知道谷歌上有多少链接正在寻找一种方法来实现这项工作。
【问题讨论】:
-
“在 for 循环中监听鼠标点击事件..” 不要。 GUI 是事件驱动的,而不是“循环”驱动的。为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。
-
感谢您的评论,但是您对我如何做一些可以得到我正在寻找的结果的事情有什么建议,因为我真的需要能够获得这些坐标以便我可以操作它们在代码中。
-
“你有什么建议吗” 发布一个 MRE / SSCCE .. “..关于我如何做一些事情来获得我正在寻找的结果" ..为了吸引人们更仔细地观察这一点。但是,您在我第一次建议时忽略了该建议,因此在有建议之前我不会再次回复。
-
但我没有看到一种方法可以按照我的意愿在 mouseClicked 函数之外使用坐标详细信息。 - 这是 GUI 的工作方式。您将 MouseListener 添加到组件中,然后在用户使用鼠标执行某些操作时响应该事件。与其问这样一个抽象的问题,不如问一个直接的问题。你为什么要等事情发生?您认为 JButton 的作用是什么。它只是坐在那里什么都不做,直到你,用户,决定点击它。这是所有 Swing 组件的工作方式。
标签: java swing loops mouselistener