首页 > 其他分享 >swing 按钮 单机 双击 长按

swing 按钮 单机 双击 长按

时间:2023-10-24 16:07:47浏览次数:25  
标签:单机 MouseEvent void 双击 clickNum 事件 swing public


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;
    }
}

标签:单机,MouseEvent,void,双击,clickNum,事件,swing,public
From: https://blog.51cto.com/u_11288266/8005179

相关文章

  • idea禁用双击ctrl
    Runanything|IntelliJ IDEADocumentationDisabledoublemodifierkeyshortcuts......
  • docker-安装单机版redis
    一 目的在docker中,安装单机版redis 二步骤1.从镜像中心拉取redis1.1查看镜像中心redis镜像,本例选择redis:7.0 1.2拉取redis镜像dockerpullredis:7.0   2.创建数据卷目录(挂载点在redis配置目录)2.1宿主机创建数据卷目录mkdir-p/docker/redis/2......
  • docker单机版Minio迁移方案
    docker单机版Minio迁移方案起因一开始并没有想到会在轻量应用服务器上部署好几个服务,因为这个轻量服务器是用来做测试用的,但是由于缺少运维的原因,正式使用的也是这台服务器上的minio,结果因为其他的服务导致服务器老是卡死,所以需要在新的服务器上重新起一个单机的minio前置条件......
  • 轻松掌握组件启动之Redis单机、主从、哨兵、集群配置
    单机配置启动Redis安装下载地址:http://redis.io/download安装步骤:1:安装gcc编译器:yuminstallgcc2:将下载好的redis‐5.0.3.tar.gz文件放置在/usr/local文件夹下,并解压redis‐5.0.3.tar.gz文件wgethttp://download.redis.io/releases/redis‐5.0.3.tar.gztarxzfredis......
  • windows下单机安装ZooKeeper
    1.下载安装JDK并配置相关网站https://www.oracle.com/java/technologies/downloads/archive/ Jdk各版本下载https://www.oracle.com/ oracle官网https://archive.apache.org/dist/zookeeper/ Zookeeper各版本下载https://zookeeper.apache.org/ ......
  • 基于Swing库的科学计算器设计与开发
    一、前记这是本人第一次作软件的设计与开发,计算器是各个行业的核心组件,我们可以在各个领域看见它的作用。而本软件的目标是解决小学生在学习数学时会遇到的问题/*小学生需要学开方吗?*/以及完成SIDE(Softwareintegrationdevelopmentenvironment)课程的第一次作业,由于是给小......
  • 基于Swing库的科学计算器设计与开发
    一、前记这是本人第一次作软件的设计与开发,计算器是各个行业的核心组件,我们可以在各个领域看见它的作用。而本软件的目标是解决小学生在学习数学时会遇到的问题/*小学生需要学开方吗?*/以及完成SIDE(Softwareintegrationdevelopmentenvironment)课程的第一次作业,由于是给小......
  • 基于Swing库的科学计算器设计与开发
    一、前记这是本人第一次作软件的设计与开发,计算器是各个行业的核心组件,我们可以在各个领域看见它的作用。而本软件的目标是解决小学生在学习数学时会遇到的问题/*小学生需要学开方吗?*/以及完成SIDE(Softwareintegrationdevelopmentenvironment)课程的第一次作业,由于是给小......
  • 前端 - 使用json-server搭建单机mock平台
    使用json-server搭建单机mock平台 简介json-server是一个Node模块,可以指定一个json文件作为数据源,运行Express服务器。可以用来在本地快速搭建一个RESTAPI风格的后端服务,模拟服务端接口数据。官网地址:json-server-npm(npmjs.com)Github地址:GitHub-typicode/json-se......
  • C# WinForm程序添加 CefSharp 发布后,双击无法打开(无反应)
    团队内将原来的企业微信弃用,启用飞书进行内部沟通。之前开发的内部工具(C#WinForm)是通过企业微信扫码登录验证身份,现在也需要变更飞书进行扫码验证。因此得重新对接飞书,所以在程序里加入了 CefSharp(谷歌内核)组件,版本号115.3.110.0。但是在功能实现后,发布给兄弟们用的时候......