JavaFx - 按下Button 一直触发按钮事件

简介: JavaFx - 按下Button 一直触发按钮事件

问题分析

长按按钮 一直不停的触发事件

分析问题

  1. 需要监听鼠标按下事件。
  2. 需要在监听到鼠标按下时候一直触发 按钮的 onAction 事件。

监听按钮的鼠标按下事件很简单,代码如下

myBtn.addEventFilter(MouseEvent.ANY, event-> {
if (event.getEventType() ==MouseEvent.MOUSE_PRESSED) {
// Todo              } else {
// Todo            }
        });

触发按钮onAction 事件怎么实现呢,通过翻阅源码发现 Buttonfire() 的方法可以触发 ActiveEvent,代码如下

myBtn.fire();

如何一直触发事件呢,这里利用javafxAnimationTimer 来做这件事,通过翻阅源码可以看到AnimationTimer是一个抽象类,javadoc上说,这个类允许创建一个Timer,并且在每一帧都会去调用它的 handle方法,我们可以利用它来实现一直触发事件。

/*** The class {@code AnimationTimer} allows to create a timer, that is called in* each frame while it is active.** An extending class has to override the method {@link #handle(long)} which* will be called in every frame.** The methods {@link AnimationTimer#start()} and {@link #stop()} allow to start* and stop the timer.*** @since JavaFX 2.0*/publicabstractclassAnimationTimer

通过继承 AnimationTimer 实现一个执行按钮事件的Timer

classExecuteTimerextendsAnimationTimer {
privatelonglastUpdate=0L;
privateButtonmbtn;
publicExecuteTimer(Buttonbutton) {
this.mbtn=button;
        }
@Overridepublicvoidhandle(longnow) {
if (this.lastUpdate>100) {
// 当按钮被按下的时候 触发 按钮事件if (mbtn.isPressed()) {
mbtn.fire();
                }
            }
this.lastUpdate=now;
        }
    }

代码实现

importjavafx.animation.AnimationTimer;
importjavafx.scene.control.Button;
importjavafx.scene.input.MouseEvent;
/*** 按钮按下时候一直执行 action事件*/publicclassWhileButtonextendsButton {
privateExecuteTimertimer=newExecuteTimer(this);
publicWhileButton() {
this.addEventFilter(MouseEvent.ANY, event-> {
if (event.getEventType() ==MouseEvent.MOUSE_PRESSED) {
timer.start();
            } else {
timer.stop();
            }
        });
    }
classExecuteTimerextendsAnimationTimer {
privatelonglastUpdate=0L;
privateButtonmbtn;
publicExecuteTimer(Buttonbutton) {
this.mbtn=button;
        }
@Overridepublicvoidhandle(longnow) {
if (this.lastUpdate>100) {
if (mbtn.isPressed()) {
mbtn.fire();
                }
            }
this.lastUpdate=now;
        }
    }
}

测试效果

importjavafx.application.Application;
importjavafx.scene.Scene;
importjavafx.scene.layout.StackPane;
importjavafx.stage.Stage;
publicclassTestWhileButtonextendsApplication {
@Overridepublicvoidstart(Stagestage) throwsException {
WhileButtonbtn=newWhileButton();
btn.setText("按下一直执行");
btn.setOnAction(event->System.out.println("hehe"));
Scenescene=newScene(newStackPane(btn), 300, 250);
stage.setTitle("Hello World!");
stage.setScene(scene);
stage.show();
    }
}

image.png

目录
相关文章
|
SpringCloudAlibaba NoSQL Java
Seata配置参考
SeataClient是直接集成到我们的业务微服务中,SeataClient的原理是代理我们jdbc数据源,在应用程序和数据库之间加了一层,通过添加的这一层来做事务管理。
697 0
|
消息中间件 存储 安全
深入理解 Qt 信号槽:高效沟通的桥梁
深入理解 Qt 信号槽:高效沟通的桥梁
1281 1
|
11月前
|
机器学习/深度学习 分布式计算 算法
【大数据分析&机器学习】分布式机器学习
本文主要介绍分布式机器学习基础知识,并介绍主流的分布式机器学习框架,结合实例介绍一些机器学习算法。
1329 6
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
752 1
|
Python
《Cython 从入门到精通》PDF 版本新鲜出炉啦!!!
《Cython 从入门到精通》PDF 版本新鲜出炉啦!!!
309 1
|
人工智能 并行计算 算法
一键抠图,毛发毕现:这个GitHub项目助你快速PS
快速抠图不留痕,设计看了都精神。
2638 0
一键抠图,毛发毕现:这个GitHub项目助你快速PS
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的实验室安全考试系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的实验室安全考试系统附带文章源码部署视频讲解等
210 2
|
编解码 网络协议 开发工具
Android平台RTSP|RTMP直播播放器技术接入说明
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台为例,介绍下如何集成RTSP、RTMP播放模块。
614 0
IAR for STM8下载、安装、注册
IAR for STM8下载、安装、注册
2160 0
|
Web App开发 测试技术
从零基础到精通,抓包神器fiddler保姆级使用教程(一)
Fiddler是一款强大的Web代理调试工具,用于记录、检查HTTP/HTTPS请求,支持断点、数据篡改、性能统计、接口测试等。它在客户端与服务器间作为代理,帮助识别和解决问题。安装流程包括访问官网下载Fiddler Classic,按照提示进行安装,并可在安装目录或桌面快捷方式启动程序。Fiddler适用于接口调试、性能分析和线上环境问题排查等场景。