JavaFx 实现按钮防抖和软件重启(Kotlin)

Kotlin+JavaFx实战之密码管理器 前言这次实现的是一个简易的密码管理器,使用SQLite来保存相应的信息,使用表格控件来对信息进行展示。在今天的文章中实现了密码的插入和查询。(想要项目源码的同学,请移至文章末尾)正文这次使用的第三方库有,JavaFx的Material风格控件库 JFoenix,以及SqLite的JDBC驱动。 阅读详情

按钮防抖

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

实现原理

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

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

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

在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")
    }
}

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

测试效果

实现思路

主要思路为,使用命令行执行java命令,重新打开jar包,同时关闭当前的jar包

但如何知道当前jar包位置?
目前我们不会知道用户把jar包放在何处,所以就不明确jar包的位置

但是也有方法,我们在jar包使用个资源文件,之后根据此资源文件即可定位到路径

在jar包如果获取resources的资源,可以得到下面的一个url字符串 jar:file:/D:/project/javafx/lanzou-downloader/out/test.jar!/desc.json

对其进行字符串处理,即可得到当前jar包文件位置

Kotlin实现

Kotlin主要是在TornadoFx的环境写的,用了TornadoFx相关的工具方法

当然,由于没使用linux系统测试过,下面存在有未实践过的代码,请各位知悉

java.exe和javaw.exe区别:

java主要是命令行使用,而javaw,则是对应java应用程序(有UI)

源码

/**
 * 获取当前jar包的文件路径
 *
 * @param url 在View中使用resources.url("")获取的参数
 * @return
 */
fun getCurrentJarPath(url: URL): File {
    val filePath = url.path.substringBeforeLast("!/")
    return File(URI.create(filePath))
}

/**
 * 重启当前应用
 *
 * @param url 在View中使用resources.url("")获取的参数
 */
fun restartApp(url: URL) {
    val jarFile = getCurrentJarPath(url)
    //开启新应用
    Runtime.getRuntime().exec("cmd.exe /c javaw -jar ${jarFile.path}")
    //关闭当前应用
    Platform.exit()
}

/**
 * 打开指定jar文件
 *
 * @param jarFile
 */
fun openApp(jarFile: File) {
    if (jarFile.extension.toLowerCase() == "jar") {
        if (isWin()) {
            Runtime.getRuntime().exec("cmd.exe /c javaw -jar ${jarFile.path}")
        } else {//linux或mac(未实践过)
            Runtime.getRuntime().exec("javaw -jar ${jarFile.path}")
        }
    }
}

/**
 * 当前系统是否为window系统
 */
fun isWin(): Boolean {
    val prop = System.getProperties()

    val os = prop.getProperty("os.name")
    return os.contains("win", true)
}

使用的话,只需要在VIew的按钮点击事件对应处调用方法即可

button("测试") {
    action{
        restartApp(resources.url("/desc.json"))
    }
}

确保你的resources文件夹,有desc.json文件(或者是其他文件)

深入解析JavaFX与Kotlin的组件化开发 摘要:本文探讨了JavaFX与Kotlin结合开发中的组件化实现问题,重点解决自定义组件初始化和显示异常。通过fx:root将FXML与Kotlin类绑定,在构造函数中加载布局并设置控制器,同时避免使用废弃的Initializable接口,改用字段注入方式。还介绍了fx:include实现组件复用。这些方法有效提升了UI组件的可维护性和复用性,为JavaFX+Kotlin开发提供了实用解决方案。(150字) 阅读详情

相关推荐

TornadoFX与JavaFX:Kotlin的UI构建新选择

本文深入探讨了TornadoFX框架如何利用Kotlin的表达能力来优化JavaFX的UI构建。通过对比JavaFX的Java代码和FXML方式,展示了TornadoFX通过Kotlin的类型安全特性和构建器模式来创建更加直观和易于管理的UI。文章还讨论了类型安全的CSS、ViewModel、EventBus等TornadoFX提供的额外功能,以及如何使用TornadoFX和Kotlin开发实用的桌面应用程序。

weixin_42497762的博客 363

使用Kotlin开发JavaFX的系列文章

JavaFX是Java语言的一个GUI框架,它的特点是使用XML来描述界面,使用CSS来描述界面的样式,使用Java来描述界面的行为。但是JavaFX用Kotlin来写,就不用XML了,也不用CSS了,只用Kotlin就可以了。Kotlin的工具使得JavaFX界面的编写变得非常顺滑。

withstand的博客 805

Kotlin的轻量级JavaFX框架

Kotlin的轻量级JavaFX框架

kotlin扩展函数(防抖)、节流

简介 如果说java是开发android的绿皮车,那么kotlin就像是开发android的动车高铁,至于为什么这么说,其中的原因之一:扩展函数 至于什么是扩展函数,本文不做过多的介绍,不懂的,需要补基础的可以找某度,本文只介绍怎么使用 使用结构如下图,其中ActivityExtends,ContextExtends,ImageViewExtends都是扩展函数 罗列其中的几个功能作为演示 1、...

wy313622821的博客 8793

Anaconda+Pycharm安装

我提前创建好一个自己项目所需的虚拟环境。步骤是:打开终端(cmd)或者 搜索 ”Anaconda Prompt“ 并打开,输入 conda create -n pytorch python=3.9 -c。

Wang_sweet的博客 3234

Wireshark教程:解密HTTPS流量

Wireshark教程:如何解密HTTPS流量

nuan444979的博客 1万+

Android中如何重新启动应用APP或重启系统

Android中如何重新启动应用APP或重启系统

weixin_42602900的博客 9009

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

Kotlin调用JavaFx

简单写了个例子,了解了下Kotlin和JavaFx的使用 记录下使用Kotlin继承JavaFx中的类:public class MainStage : Application()Application就是要继承的类Kotlin调用Java代码的参数转换问题:Class类型在Kotlin中需要使用 MainStage::class.java 的形式调用 MainStage是类名,意为传递 Main...

纵马饮白虹的博客 2477

Q学习(Q-learning)入门小例子及python实现

一、从马尔科夫过程到Q学习 # 有一定基础的读者可以直接看第二部分 Q学习(Q-learning)算法是一种与模型无关的强化学习算法,以马尔科夫决策过程(Markov Decision Processes, MDPs)为理论基础。 标准的马尔科夫决策过程可以用一个五元组<S,A,P,R,γ>表示,其中: S是一个离散有界的状态空间; A是一个离散的动作空间; P为状态转...

wlm_py的博客 4万+

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4401

从零开始使用Kotlin开发一个桌面软件系列:目录

这个系列主要介绍使用kotlin开发一个JAR程序,然后你可以自主选者打包到各平台,最终的成品链接: 生活助手:基于Kotlin 前言:使用kotlin语法基于javaFx的TornadoFx框架,UI使用javaFx的质感库Jfoenix(兼容性非常强,基本上Kotlin可以无缝接入) 创建TornadoFx项目 引入依赖库:Jfoenix javaFx基础知识(布局,组件,绑定变量,...

4253

如何理解下一代ERP 即:华为MetaERP

如何理解下一代ERP 即:华为MetaERP 华为的 MetaERP核心定位: 华为MetaERP是华为公司自主研发的下一代企业核心商业管理系统。它不仅仅是一个传统的ERP(企业资源规划)系统,更是一个面向未来、基于云原生、AI驱动、安全可信的企业核心管理平台。

金牌架构师 1144

Kotlin编写JavaFX的顺滑之数据控件(一)列表视图ListView

一个列表视图控件,可以实现展示一系列项,每一个项对应ListView界面中的一行。这个控件很简单,但是也很好用。当采用Kotlin编写的时候,就更好用了。

withstand的博客 973

DDD系列 - 第12讲 如何在DDD中实现Query服务(轻量化CQRS)

轻量化CQRS、整合Repository和DAO的优势。

罗小爬的技术宝书 267

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

探索反应式编程新高度:RxKotlinFX - JavaFX与Kotlin的完美结合

探索反应式编程新高度:RxKotlinFX - JavaFX与Kotlin的完美结合 1、项目介绍 RxKotlinFX 是一个针对 RxJavaFX 库的扩展库,专为在 Kotlin 中进行优雅的反应式编程而设计。这个框架特别适合与 TornadoFX 配合使用,您可以在这里找到一个完整的演示示例。 2、项目技术分析 RxKotlinFX 实现了 RxJavaFX 的静态工厂方法作为 Kotl...

gitblog_00069的博客 554

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TornadoFX:轻量级Kotlin JavaFX框架

TornadoFX是一个轻量级的JavaFX框架,专为Kotlin语言设计。它旨在简化JavaFX应用程序的开发过程,提供了一种更加简洁和现代的方式来构建桌面应用程序。TornadoFX充分利用了Kotlin的特性,如类型安全、扩展函数和DSL(领域特定语言),使得开发者能够以更少的代码实现复杂的功能。 ## 项目核心功能 1. **MVC和MVP支持**:TornadoFX支持MVC(模型-...

gitblog_01033的博客 694

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Kotlin Flow 防抖 节流

防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。

qq_33552379的博客 719

Android app主动杀死进程并重启

这里的问题原因就是当settings里关闭了权限之后,安卓系统会主动关闭app进程,使得重新打开app时,之前保存的app的activity页面是被异常关闭的,会触发 onCreate方法的参数savedInstanceState: Bundle不为空。最近出现一个bug,这个bug还是很常见的很容易实现,在设计代码的时候还是需要注意的,就是在app授权location定位权限之后,将app放在后台,在设置里对app的权限关闭操作,再从后台打开app,app会crash。

chenhuakang的博客 3426

如何用javafx实现闪烁效果?

想用javafx,实现图形闪烁效果,譬如说创造一个文本但根据以下方法,只能改变一次颜色?求高人指点! Timeline animation = new Timeline(new KeyFrame(Duration.millis(500),e->{    int t = 0;    if(t%2 == 0) {  &nbsp...

如何用javafx实现闪烁效果 1778

Kotlin去抖动-频率限制

/间隔结束后,最新数据被执行。

Lee465357793的博客 497

java重新运行_如何点击按钮,重新运行(我是初学者)?

下面是我全部的代码:package day0411;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.uti...

weixin_34901243的博客 924

TornadoFX 2.0:为 Kotlin 开发的 JavaFX 框架

TornadoFX 2.0:为 Kotlin 开发的 JavaFX 框架 TornadoFX 2.0 是一个基于 Kotlin 语言的开源 JavaFX 框架,旨在为开发者提供一种更加高效、简洁的方式来构建桌面应用程序。该项目基于 Gradle 构建,支持 Java 11 及以上版本。 项目基础介绍 编程语言:Kotlin 构建系统:Gradle 支持的 Java 版本:Java 11+ 支持的...

gitblog_00356的博客 632

协程的去抖动、节流、重试选项

Kotlin 语言长期以来一直是 Android 应用程序开发的事实上的标准,这也就不足为奇了——空类型安全性、高阶函数和许多其他方便的机制帮助它赢得了开发人员的欢迎和喜爱。协程就是一种大大简化了异步代码工作的机制。在本文中,通过向远程服务器发出请求的示例,将展示如何使用协程来调整异步操作随着时间的推移执行的顺序(去抖、限制、重试)。

chuyouyinghe的专栏 1342
上一篇: 顶级!13位专家力荐Spring5为企业级开发提供一站式方案
下一篇: Linux环境下fastdfs部署
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值