我有一个实现 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) {
}
}
原文由 Sane 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如其他答案所指出的,做你的工作的地方 不在 鼠标事件侦听器方法中。
MouseEvent
中也没有明确的“鼠标按下”概念,因此您必须自己跟踪。我已经提供了如何执行此操作的示例。还要注意MouseEvent.BUTTON1
参考,因为这只是为了跟踪鼠标左键的状态。这是您必须开始了解并发的地方。出于这个原因,我添加了一个同步方法,因为您需要知道当多个线程同时访问属性时会发生有趣的事情,并且
synchronized
是一种保持这种理智的机制。考虑进一步阅读超出本示例范围的内容。未经测试,但这应该有效: