San*_*ane 6 java swing mouseevent mouselistener
我有一个实现MouseListener(JPanel)的类.当我点击面板时会发生一些事情.我想要的是某种while循环,只要按下鼠标按钮就会循环.
@Override
public void mousePressed(MouseEvent e) {
while(e.isPressedDownD) { // <--
//DO SOMETHING
}
}
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但我希望你理解我正在努力实现的目标.全班有兴趣的人:
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*win 14
正如其他答案所指出的,完成工作的地方不在鼠标事件监听器方法中.
此外,没有明确的"鼠标按下"概念MouseEvent,因此您必须自己跟踪.我提供了一个如何执行此操作的示例.还要注意MouseEvent.BUTTON1引用,因为这只是为了跟踪鼠标左键的状态.
这是您必须开始学习并发性的地方.出于这个原因,我已经添加了一个synchronized方法,因为你需要知道当多个线程同时访问属性时会发生有趣的事情,并且这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();
}
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*uns 11
为什么这么多答案错误地断言MouseEvent中没有明确的"鼠标按下"概念?
虽然其他评论者是正确的,OP不应该在事件处理程序中执行所有这些操作,但在其他情况下,查询鼠标侦听器中的按钮状态是有用的.在这些情况下,您实际上可以确定按钮关闭状态.例如:
@Override
public void mouseExited(MouseEvent event) // Or any other mouse event handler...
{
int buttonsDownMask = MouseEvent.BUTTON1_DOWN_MASK
| MouseEvent.BUTTON2_DOWN_MASK
| MouseEvent.BUTTON3_DOWN_MASK; // Or whichever buttons you care about...
if ( (event.getModifiersEx() & buttonsDownMask) != 0 )
System.out.println("Hey! Some button is pressed!");
}
Run Code Online (Sandbox Code Playgroud)
特别注意该MouseEvent.getModifiersEx()方法的使用,以及MouseEvent.BUTTON1_DOWN_MASK和朋友一起使用.