在Java中,什么事件*在鼠标按钮下连续*被触发?

时间:2009-12-30 10:45:35

标签: java awt mouseevent

我想知道在Java中是否存在按下(按下)鼠标按钮时连续触发的事件,即使鼠标未移动也是如此。我在典型的MouseListeners中找不到它:

  • 仅当用户移动鼠标时按下按钮
  • 才会触发MouseDragged
  • 仅按按钮
  • 时,MousePressed仅被触发一次

就是这样。 知道如何制作这样的活动吗?

干杯

JY

5 个答案:

答案 0 :(得分:8)

有一个明显的原因是为什么这个事件在MouseListener中不可用:它会通过事件向你发送垃圾邮件,以便一切都放慢速度。你想每秒,每毫秒,甚至更频繁地接收这个事件吗?如果你需要,你必须自己做。

为了简化此过程,您当然需要mousePressedmouseReleased来确定当前是否按下按钮。然后你需要运行某种循环来生成你想要的相应事件。

您可能还希望通过轮询工作,即扩展您的MouseListener类,以便它可以告诉您按钮是否仍然按下,并且您需要那些可以主动轮询该按钮的事件。这取决于您希望如何使用这些事件,哪种方法更合适。

答案 1 :(得分:7)

如果您需要在鼠标按钮关闭时执行某些操作,只需在检测到mousePressed事件时启动它,然后继续执行该操作直到您检测到mouseReleased事件。然后你不需要让你的事件持续开火。 e.g。

public void mousePressed(MouseEvent e) {
    someCondition = true;
    while(someCondition) {
        //do something
    }
}

public void mouseReleased(MouseEvent e) {
    someCondition = false;
}

编辑: 正如其他人所说,代码需要与事件线程分开,否则对mouseReleased的调用将被阻止,阻止循环结束。

答案 2 :(得分:5)

James Goodwin的代码不起作用。 mousePressed和mouseReleased都是从GUI线程触发的,因此mousePressed中的阻塞将阻止mouseReleased被触发,这意味着循环将永远继续。

如果你已经有一个单独的线程进行处理,那么使用mousePressed向该线程指示该事件应该开始,并且mouseReleased停止。

如果你没有单独的线程并且不想要麻烦,那么Timer可能是最简单的方法。 javadoc on Timer

具体来说,您应该创建一个TimerTask,它可以执行多次您想要执行的操作并使用Timer.schedule对其进行排队:

Timer timer = new Timer();
TimerTask task = new MyTimerTask();

private class MyTimerTask extends TimerTask {
    public void run() {
        // your code here
    }
}

public void mousePressed(MouseEvent e) {
    timer.scheduleAtFixedRate(task, 0, 1000); // Time is in milliseconds
    // The second parameter is delay before the first run
    // The third is how often to run it
}

public void mouseReleased(MouseEvent e) {
    task.cancel();
    // Will not stop execution of task.run() if it is midway
    // But will guarantee that after this call it runs no more than one more time
}

我很确定这是最简单的方法,因为它不涉及线程间通信。

哦,正如彼得所说的那样,你必须添加代码才能让用户将鼠标放在你的应用上并将鼠标放在其他地方。

答案 3 :(得分:1)

没有这样的事件

您可以通过在mousedown方法中启动计时器并在鼠标释放中结束相同的计时器来创建自己的

您还需要进行一些失败保存,以确保当您将移动移动到另一个组件或甚至移动到其他框架或非Java gui部件上时计时器停止

答案 4 :(得分:0)

我想你会发现答案是否定的,没有这样的事件。不仅适用于Java,还适用于任何GUI框架。除了绑定事件队列之外,它没有用处。

你需要通过捕获鼠标按下事件然后定时触发事件来创建自己的事件,直到鼠标按下事件。