Java MouseEvent,检查是否按下
我有一个实现 MouseListener (JPanel) 的类。当我点击面板时,就会发生一些事情。我想要的是某种 while 循环,只要按下鼠标左键就会循环。
@Override
public void mousePressed(MouseEvent e) {
while(e.isPressedDownD) { // <--
//DO SOMETHING
}
}
这显然行不通,但我希望你明白我想要实现的目标。 有兴趣的全班:
package control;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import model.GridModel;
import view.GUIView;
public class MapListener implements MouseListener{
private GridModel model;
private GUIView view;
private int posX;
private int posY;
public MapListener(GridModel model, GUIView view) {
this.model = model;
this.view = view;
}
@Override
public void mouseClicked(MouseEvent e) {
posX = e.getX();
posY = e.getY();
model.setMouseAtX(posX);
model.setMouseAtY(posY);
view.paintTile();
System.out.println("X: " + posX + " Y: " + posY);
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent e) {
while(e.getModifiers() == MouseEvent.MOUSE_PRESSED) { //Obviously doesn't work
//DO SOMETHING
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}
I have a class that implements MouseListener (JPanel). When I click on the panel something happens. What I want is some kind of while-loop that loops as long as left mousebutton is pressed down.
@Override
public void mousePressed(MouseEvent e) {
while(e.isPressedDownD) { // <--
//DO SOMETHING
}
}
This obviously doesn't work, but I hope you understand what I'm trying to achieve.
The whole class for those that are interested:
package control;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import model.GridModel;
import view.GUIView;
public class MapListener implements MouseListener{
private GridModel model;
private GUIView view;
private int posX;
private int posY;
public MapListener(GridModel model, GUIView view) {
this.model = model;
this.view = view;
}
@Override
public void mouseClicked(MouseEvent e) {
posX = e.getX();
posY = e.getY();
model.setMouseAtX(posX);
model.setMouseAtY(posY);
view.paintTile();
System.out.println("X: " + posX + " Y: " + posY);
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent e) {
while(e.getModifiers() == MouseEvent.MOUSE_PRESSED) { //Obviously doesn't work
//DO SOMETHING
}
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
正如其他答案所指出的,完成工作的地方不在鼠标事件侦听器方法中。
此外,
MouseEvent
中没有明确的“鼠标按下”概念,因此您必须自己跟踪它。我已经提供了如何执行此操作的示例。另请注意MouseEvent.BUTTON1
引用,因为这只是为了跟踪鼠标左键的状态。这是你必须开始学习并发的地方。出于这个原因,我添加了一个同步方法,因为您需要知道当多个线程同时访问属性时会发生有趣的事情,而
synchronized
是一种保持这种理智的机制。请考虑进一步阅读超出本示例范围的内容。未经测试,但这应该有效:
As pointed out by other answers, the place to do your work is not in the mouse event listener methods.
Also there is no explicit "mouse pressed" notion in
MouseEvent
, so you must track that yourself. I have provided an example of how to do this. Also note theMouseEvent.BUTTON1
references, as this is just to track the state of the left mouse button.This is where you must start to learn about concurrency. For that reason, I've added in a synchronized method as you need to be aware that funny things happen when multiple threads access properties at the same time, and
synchronized
is a mechanism for keeping this sane. Consider it further reading beyond the scope of this example.Untested, but this should work:
为什么这么多答案错误地断言 MouseEvent 中没有明确的“鼠标按下”概念?
尽管其他评论者认为 OP 不应该在事件处理程序中执行所有这些操作是正确的,但在其他情况下,在鼠标侦听器中查询按钮状态很有用。在这些情况下,您实际上可以确定按钮按下状态。例如:
特别注意
MouseEvent.getModifiersEx()
方法以及MouseEvent.BUTTON1_DOWN_MASK
等方法的使用。Why do so many of these answers wrongly assert that there is no explicit "mouse pressed" notion in MouseEvent?
Although the other commenters are correct that the OP should not be doing all that stuff in an event handler, there are other situations in which querying the button state in a mouse listener is useful. In those cases, you actually CAN determine the button down state. For example:
Notice in particular the use of the
MouseEvent.getModifiersEx()
method, along withMouseEvent.BUTTON1_DOWN_MASK
and friends.您可以创建一个包含 while 循环的新线程。
当按下鼠标按钮时,您将启动该线程。当鼠标按钮被释放时,您可以停止它。
You could create a new Thread containing your while loop.
You start that Thread when the mouse button is pressed. You stop it when the mouse button is released.
您不应该在事件处理程序中执行此操作,因为在事件处理程序退出之前不会处理更多事件。
您想要实现的目标可以通过单独的工作线程来完成。从 mousePressed 侦听器创建线程,在线程中执行您想要执行的任何操作(这应该包含 while 循环),并在释放鼠标时使线程退出(您的 mouseReleased) code> 监听器应该通知线程)。
You shouldn't be doing that in an event handler as no more events will be processed until the event handler exits.
What you want to achieve can be done with a separate worker thread. Create the thread from the
mousePressed
listener, do whatever you want to do in the thread (this should contain the while loop) and make the thread exit when the mouse is released (yourmouseReleased
listener should notify the thread).例如
for example