随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
java中没有给出鼠标双击事件,虽然可以通过事件源e.getClickCount()==2来判断鼠标点击次数,但是执行双击事件的同时也执行了单击事件,并没有把双击和单击区分开来。
我们可以这样考虑,当第一次单击鼠标的时候让鼠标单击事件延时0.2秒执行,而在这段时间里等待第二次单击,如果有第二次单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执行单击任务.
package com.lovo;import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class MyMouseListener extends MouseAdapter {private static boolean flag = false;// 用来判断是否已经执行双击事件private static int clickNum = 0;// 用来判断是否该执行双击事件public void mouseClicked(MouseEvent e) {final MouseEvent me = e;// 事件源this.flag = false;// 每次点击鼠标初始化双击事件执行标志为falseif (this.clickNum == 1) {// 当clickNum==1时执行双击事件this.mouseDoubleClicked(me);// 执行双击事件this.clickNum = 0;// 初始化双击事件执行标志为0this.flag = true;// 双击事件已执行,事件标志为truereturn;}// 定义定时器Timer timer = new Timer();// 定时器开始执行,延时0.2秒后确定是否执行单击事件timer.schedule(new TimerTask() {private int n = 0;// 记录定时器执行次数public void run() {if (MyMouseListener.flag) {// 如果双击事件已经执行,那么直接取消单击执行n = 0;MyMouseListener.clickNum = 0;this.cancel();return;}if (n == 1) {// 定时器等待0.2秒后,双击事件仍未发生,执行单击事件mouseSingleClicked(me);// 执行单击事件MyMouseListener.flag = true;MyMouseListener.clickNum = 0;n = 0;this.cancel();return;}clickNum++;n++;}}, new Date(), 500);}/*** 鼠标单击事件* * @param e* 事件源参数*/public void mouseSingleClicked(MouseEvent e) {System.out.println("Single Clicked!");}/*** 鼠标双击事件* * @param e* 事件源参数*/public void mouseDoubleClicked(MouseEvent e) {System.out.println("Doublc Clicked!");}
}
package com.lovo;import javax.swing.JButton;
import javax.swing.JFrame;public class Test extends JFrame {public Test() {super("test");JButton b = new JButton("button");b.setBounds(50, 50, 100, 30);this.setLayout(null);this.add(b);b.addMouseListener(new MyMouseListener());this.setSize(500, 300);this.setVisible(true);this.setLocationRelativeTo(null);}public static void main(String args[]) {new Test();}}