import com.other.TimerUtils;
import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 单机 双击 长按
*/
public abstract class MyMouseListener extends MouseAdapter {
private static boolean flag = false;//用来判断是否已经执行双击事件
private static int clickNum = 0;//用来判断是否该执行双击事件
private Timer newTimer;
private boolean isExeLong;
/**
* 鼠标按下事件发生时调用的方法。当用户按下鼠标按钮时触发,可以通过MouseEvent对象获取有关鼠标按下的信息。
*/
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
// 鼠标左键按下
if (newTimer != null) {
return;
}
isExeLong = false;
newTimer = TimerUtils.startTimer(new Runnable() {
@Override
public void run() {
System.out.println("long");
stopTimer();
onLongClick(e);
isExeLong = true;
stopTimer();
// isExeLong = false;
}
}, 1000);
}
}
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
stopTimer();
}
@Override
public void mouseClicked(MouseEvent e) {
final MouseEvent me = e;//事件源
this.flag = false;//每次点击鼠标初始化双击事件执行标志为false
if (this.clickNum == 1) {//当clickNum==1时执行双击事件
if (isExeLong) return;
stopTimer();
this.mouseDoubleClicked(me);//执行双击事件
this.clickNum = 0;//初始化双击事件执行标志为0
this.flag = true;//双击事件已执行,事件标志为true
return;
}
//定义定时器
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秒后,双击事件仍未发生,执行单击事件
if (!isExeLong) {
stopTimer();
mouseSingleClicked(me);//执行单击事件
}
MyMouseListener.flag = true;
MyMouseListener.clickNum = 0;
n = 0;
this.cancel();
return;
}
System.out.println("n = " + clickNum);
clickNum++;
n++;
}
}, new Date(), 200);
}
/**
* 鼠标单击事件
*
* @param e 事件源参数
*/
public abstract void mouseSingleClicked(MouseEvent e);
/**
* 鼠标双击事件
*
* @param e 事件源参数
*/
public void mouseDoubleClicked(MouseEvent e) {
// System.out.println("Doublc Clicked!");
}
/**
* 鼠标长按事件
*
* @param e 事件源参数
*/
public void onLongClick(MouseEvent e) {
// System.out.println("onLongClick Clicked!");
}
private void stopTimer() {
if (newTimer == null) {
return;
}
newTimer.cancel();
newTimer = null;
}
}
swing 按钮 单机 双击 长按
原创
©著作权归作者所有:来自51CTO博客作者痛而不觉的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Idea中双击操作总是选中当前行问题
Idea中双击选中整行问题解决
Idea 选中整行 双击 -
Unity 实现单击、双击、长按功能按钮
长按、单击、双击封装
Time Click ide button unity -
Android之按钮点击事件(单击、双击、长按等)
因为按钮双击时仍然会先触发单击事件。如果只需要处理双击事件的话则不需考虑这一点,如果要在同一
android gitee ide 单击事件