Java MouseEvent,检查是否按下

标签 java swing mouseevent mouselistener

我有一个实现 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/

相关文章:

java - XML DAO 示例

java - 无法将整数文件写入java中的文件

java - 向 COM 端口发送字符串

java - 获取图像的高度和宽度时,ImageObserver 字段的用途是什么?

java - 选择两个 JTable 中的多个项目

java - 将 JTable 添加到 JFrame

java - 如何填充 Jlist

qt - 如何使用 QTestLib [Qt5] 模拟鼠标滚轮事件

java - JTabbedPane点击事件

javascript - Jquery/JS 将 "paste"事件处理程序绑定(bind)到输入文本框