我有一个实现 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) {
}
}
最佳答案
正如其他答案所指出的,鼠标事件监听器方法中不是您工作的地方。
MouseEvent
中也没有明确的“鼠标按下”概念,因此您必须自己跟踪它。我已经提供了如何执行此操作的示例。还要注意 MouseEvent.BUTTON1
引用,因为这只是为了跟踪鼠标左键的状态。
这是您必须开始了解并发的地方。出于这个原因,我添加了一个同步方法,因为您需要知道当多个线程同时访问属性时会发生有趣的事情,而 synchronized
是一种保持这种状态的机制。考虑进一步阅读超出本示例范围的内容。
未经测试,但这应该有效:
volatile private boolean mouseDown = false;
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
mouseDown = true;
initThread();
}
}
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
mouseDown = false;
}
}
volatile private boolean isRunning = false;
private synchronized boolean checkAndMark() {
if (isRunning) return false;
isRunning = true;
return true;
}
private void initThread() {
if (checkAndMark()) {
new Thread() {
public void run() {
do {
//do something
} while (mouseDown);
isRunning = false;
}
}.start();
}
}
关于Java MouseEvent,检查是否按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828684/