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数据源,在应用程序和数据库之间加了一层,通过添加的这一层来做事务管理。
774 0
|
消息中间件 存储 安全
深入理解 Qt 信号槽:高效沟通的桥梁
深入理解 Qt 信号槽:高效沟通的桥梁
1335 1
|
12月前
|
机器学习/深度学习 分布式计算 算法
【大数据分析&机器学习】分布式机器学习
本文主要介绍分布式机器学习基础知识,并介绍主流的分布式机器学习框架,结合实例介绍一些机器学习算法。
1441 6
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
819 1
|
Python
Python的Virtualenv与Venv环境管理器
介绍Python的两种环境管理工具Virtualenv和venv,包括它们的安装、创建、激活、退出环境以及查看帮助信息的方法,同时对比了两者的特点和使用场景。
503 2
Python的Virtualenv与Venv环境管理器
|
Python
《Cython 从入门到精通》PDF 版本新鲜出炉啦!!!
《Cython 从入门到精通》PDF 版本新鲜出炉啦!!!
336 1
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的实验室安全考试系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的实验室安全考试系统附带文章源码部署视频讲解等
219 2
|
编解码 网络协议 开发工具
Android平台RTSP|RTMP直播播放器技术接入说明
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台为例,介绍下如何集成RTSP、RTMP播放模块。
650 0
|
搜索推荐 Java API
如何在 Java 中反转 ArrayList
【8月更文挑战第23天】
373 1
|
存储 SQL Java
Java实现关键字模糊查询的高效方法及实践
实现关键字模糊查询的方法有多种,每种方法都有其适用场景。在选择合适的方法时,应考虑实际需求、数据量大小、性能要求等因素。正则表达式适用于处理简单文本或小数据集;数据库模糊查询适用于存储在RDBMS中的数据;而第三方库,则适合需要进行复杂搜索的大型项目。选用合适的工具,可以有效提升搜索功能的性能和用户体验。
305 6