JavaFx 实现按钮防抖功能

 更新时间:2022年01月23日 08:46:05   作者:Stars-one  
最近Sun公司推出了JavaFX框架,使用它可以利用JavaFX编程语言来开发富互联网应用程序(RIA),这篇文章主要介绍了JavaFx 实现按钮防抖功能,需要的朋友可以参考下

JavaFX

JavaFX 是一个开源的下一代客户端应用平台,适用于基于Java构建的桌面、移动端和嵌入式系统。 它是许多个人和公司的共同努力的成果,目的是为开发丰富的客户端应用提供一个现代、高效、功能齐全的工具包。

javafx中文网站

Android平台的APP,一般是有需要进行设置按钮的防抖(即在短时间内无法多次点击),我想在JavaFx项目中也是实现防抖功能,便是研究了下

实现原理

点击按钮前,需要记录当前点击的时间,在按钮下一次点击的时候,与之前记录的点击时间进行计算,判断两者的间隔时间是否大于设定的条件值

这里思路没有是嘛难度,主要是点击时间的历史记录该如何记录?有以下几种方法

  • 使用Map存储(按钮过多占用资源较大)
  • 使用控件对象提供的某个无用字段进行存储

在Android中,可以使用View中的tag来保存信息

而在JavaFx中,所有的控件都有userData的字段,有了这个,我们即可去存储时间

实现代码

Kotlin版:

kotlin版我是使用了扩展方法,对BUtton类进行了扩展,不太明白扩展方法的可以查下资料,简单来说即是给Button类新增了个方法

//注意Button是javafx包的
fun Button.isFastClick(): Boolean {
    val lastClickTime = userData as Long?
    val currentTime = System.currentTimeMillis()

    userData = currentTime
    //这里我设置为1s内多次点击无效,可以根据需要调整
    if (lastClickTime != null && currentTime - lastClickTime <= 1000) {
        return true
    }
    return false
}

使用:

button{
    action {
        //不是快速点击才进入点击逻辑
        if (!isFastClick()) {
            println("hello")
        }
    }
}

Kotlin优化版

稍微重新封装了下,使用更加优雅

/**
 * 是否快速点击
 */
fun Button.isFastClick(time:Long): Boolean {
    val lastClickTime = userData as Long?
    val currentTime = System.currentTimeMillis()

    userData = currentTime
    if (lastClickTime != null && currentTime - lastClickTime <= time) {
        return true
    }
    return false
}

/**
 * 设置防抖的按钮Action
 * @param time 单位毫秒,默认1000(1s内防抖)
 */
fun Button.setActionHank(time:Long = 1000,op: () -> Unit) {
    action {
        if (!isFastClick(time)) {
            op()
        }
    }
}

使用:

button("测试") {
    //这里不用action了
    setActionHank{
        println("111")
    }
}

PS:后续会收录到common-controls的库中

Java版

class ButtonUtils {
    public static boolean isFastClick(Button button) {
        Object userData = button.getUserData();

        long currentTime = System.currentTimeMillis();
        button.setUserData(currentTime);
        if (userData instanceof Long) {
            Long lastClickTime = (Long) userData;
            return currentTime - lastClickTime <= 1000;
        }
        return false;
    }
}

测试效果

到此这篇关于JavaFx 实现按钮防抖功能的文章就介绍到这了,更多相关JavaFx 按钮防抖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 安全模型,你了解了吗

    Java 安全模型,你了解了吗

    这篇文章主要介绍了Java 安全模型。Java的安全模型是其多个重要结构特点之一,它使Java成为适用于网络环境的技术。Java安全模型侧重于保护终端用户免受从网络下载的、来自不可靠来源的、恶意程序(以及善意程序中的bug)的侵犯。,需要的朋友可以参考下
    2019-06-06
  • 一篇文章总结Java虚拟机内存区域模型

    一篇文章总结Java虚拟机内存区域模型

    这篇文章主要介绍了一篇文章总结Java虚拟机内存区域模型,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用、服务对象以及其中可能产生的问题,作为大家的面试宝典。,需要的朋友可以参考下
    2019-06-06
  • Springboot的启动原理详细解读

    Springboot的启动原理详细解读

    这篇文章主要介绍了Springboot的启动原理详细解读,springboot项目一般都是打包成jar包直接运行main方法启动,当然也可以跟传统的项目一样打包war包放在tomcat里面启动.那么springboot怎么直接通过main方法启动呢,需要的朋友可以参考下
    2023-11-11
  • Java反射(JDK)与动态代理(CGLIB)详解

    Java反射(JDK)与动态代理(CGLIB)详解

    下面小编就为大家带来一篇浅谈Java反射与动态代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • 深入浅出解析Java ThreadLocal原理

    深入浅出解析Java ThreadLocal原理

    ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,感兴趣的朋友快来看看吧
    2021-11-11
  • js中去除字符串中所有的html标签代码实例

    js中去除字符串中所有的html标签代码实例

    这篇文章主要介绍了js中去除字符串中所有的html标签代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java中的异步与线程池解读

    Java中的异步与线程池解读

    这篇文章主要介绍了Java中的异步与线程池,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • SpringBoot各种参数校验的实例教程

    SpringBoot各种参数校验的实例教程

    经常需要提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的操作,为了避免出现一些错误的数据等,一般需要对数据进行校验,下面这篇文章主要给大家介绍了关于SpringBoot各种参数校验的相关资料,需要的朋友可以参考下
    2022-03-03
  • 一文解析Apache Avro数据

    一文解析Apache Avro数据

    本文是avro解析的demo,当前FlinkSQL仅适用于简单的avro数据解析,复杂嵌套avro数据暂时不支持。本文主要解析Apache Avro数据的相关内容,感兴趣的朋友一起看看吧
    2021-12-12
  • java实现文件夹上传功能实例代码(SpringBoot框架)

    java实现文件夹上传功能实例代码(SpringBoot框架)

    在web项目中上传文件夹现在已经成为了一个主流的需求,下面这篇文章主要给大家介绍了关于java实现文件夹上传功能(springBoot框架)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论