问题分析

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

分析问题

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

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

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

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

myBtn.fire();

如何一直触发事件呢,这里利用javafx 的 AnimationTimer 来做这件事,通过翻阅源码可以看到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*/
public abstract class AnimationTimer

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

class ExecuteTimer extends AnimationTimer {private long lastUpdate = 0L;private Button mbtn;public ExecuteTimer(Button button) {this.mbtn = button;}@Overridepublic void handle(long now) {if (this.lastUpdate > 100) {// 当按钮被按下的时候 触发 按钮事件if (mbtn.isPressed()) {mbtn.fire();}}this.lastUpdate = now;}}

代码实现

import javafx.animation.AnimationTimer;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;/*** 按钮按下时候一直执行 action事件*/
public class WhileButton extends Button {private ExecuteTimer timer = new ExecuteTimer(this);public WhileButton() {this.addEventFilter(MouseEvent.ANY, event -> {if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {timer.start();} else {timer.stop();}});}class ExecuteTimer extends AnimationTimer {private long lastUpdate = 0L;private Button mbtn;public ExecuteTimer(Button button) {this.mbtn = button;}@Overridepublic void handle(long now) {if (this.lastUpdate > 100) {if (mbtn.isPressed()) {mbtn.fire();}}this.lastUpdate = now;}}
}

测试效果

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;public class TestWhileButton extends Application {@Overridepublic void start(Stage stage) throws Exception {WhileButton btn = new WhileButton();btn.setText("按下一直执行");btn.setOnAction(event -> System.out.println("hehe"));Scene scene = new Scene(new StackPane(btn), 300, 250);stage.setTitle("Hello World!");stage.setScene(scene);stage.show();}
}

JavaFx - 按下Button 一直触发按钮事件相关推荐

  1. winform之Enter键触发按钮事件

    一.背景 小伙伴们在做winform开发时,比如登陆界面,可能需要用键盘Enter键去触发登陆这个按钮事件,如何实现呢? 二.解决思路 点击主窗体,在属性中找到AcceptButton,然后将其属性值 ...

  2. html打开时按钮自动触发事件,html在用户按下按键时触发的事件属性onkeydown

    实例 当用户按键时执行一段 JavaScript: 浏览器支持 IE Firefox Chrome Safari Opera 所有主流浏览器都支持 onkeydown 属性. 定义和用法 onkeyd ...

  3. 下拉框触发单击事件_谈谈如何给下拉框option添加点击事件?

    我们在用到下拉列表框select时,需要对选中的选项触发事件,其实本身没有触发事件方法,我们只有在select里的onchange方法里触发. 想添加一个option的触发事件,在option中添加o ...

  4. python调用菜单响应事件_[Python] wxpython 编程触发菜单或按钮事件

    最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求.在其他Gui界面的语言中有postevent.triggerevent 调用事件名称的函 ...

  5. vue 回车查询 按钮_vue之在页面中监听键盘的Enter键来触发某个按钮事件

    项目中得需求:给页面某个按钮绑定Enter键,但是按钮不在form中,直接给按钮绑定后此按钮只有获取了焦点按键才会触发,显然,一直保持按钮获取焦点是不现实得.所以通过查询等,结合项目需求,完成了下面得 ...

  6. 逆向破解之易语言按钮事件特征码

    什么是按钮事件特征码 破解的一个用易语言编写的软件,通常先要搜索到按钮事件特征码,但是并不是说你按钮事件特征码处下断点就一定能精准的捕获按钮事件.例如易语言时钟控件或启动窗口事件都会通过消息派遣至按钮 ...

  7. php onmouse,html在鼠标按钮在元素上按下时触发的事件属性onmousedown

    实例 当在段落上按下鼠标按钮时执行一段 JavaScript: 请点击此文本! 浏览器支持 IE Firefox Chrome Safari Opera 所有主流浏览器都支持 onmousedown ...

  8. javaFx中的Button样式设置、点击事件、设置快捷键等

    Button样式设置 button的背景.边框.字体设置,比较基础简单的示例如下: public class JavaFxNote extends Application {public static ...

  9. [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情

    引言: 当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑 ...

最新文章

  1. android 相机智能补光,美图秀秀智能补光功能应用详解
  2. 原生js系列之DOM工厂模式
  3. finereport字段显示设置_QA | 表单如何设置字段显示逻辑?
  4. linux下命令集合
  5. poi读取excel导入mysql_poi读取xlsx表格内容并插入到mysql中,OutOfMemoryError
  6. python batch_size_深度学习中的batch的大小对学习效果有何影响?
  7. JS代码混淆 支持PHP .NET PERL
  8. tempdb数据库清理_tempdb数据库,简介和建议
  9. 软技能-代码之外的生存指南-读书笔记(持续更新中)
  10. 数据集查找神器!100个大型机器学习数据集都汇总在这了 | 资源
  11. 元数据管理Atlas
  12. Filenet:主打底层技术创新,检索分发挖矿开创全民挖矿时代!
  13. 43种名车标志及来历
  14. Liang-Barsky算法思想及简单cpp实现
  15. IntelliJ IDEA2019.1.2汉化包
  16. 使用 Trapezoidal Rule(梯形法则)求积分
  17. 双十一不孤单,再过几小时北欧人民也和你一样开始抢单
  18. 商汤科技徐立:AI 将在10 年内创造一个印度和中国的总产值
  19. 性能测试能力提升最终篇-全链路压测
  20. Mentor-dft 学习笔记 day44-Low-Power Design Test

热门文章

  1. GlusterFS基本部署
  2. python基础训练 day8
  3. WQ7033开发指南(功能篇)之5.0 入耳检测之7033自带入耳触摸测试
  4. OOP 三大特征之多态(Polymorphism)
  5. 同样是做网站,为何你的不赚钱
  6. php判断是否手机,PHP如何判断是否为手机端
  7. 成功职业指导:我适合往管理方向发展吗?
  8. 如何发现数据库连接泄露
  9. java发展趋势看法_我对前端技术更新的看法以及未来发展趋势预测
  10. Linux的BSD格式什么意思,BSD 文件扩展名: 它是什么以及如何打开它?