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

目录
相关文章
|
4月前
|
C#
c# Gridview 点击checkbox 触发的事件
c# Gridview 点击checkbox 触发的事件
el-popover 点击取消按钮,弹窗仍然无法关闭
el-popover 点击取消按钮,弹窗仍然无法关闭
|
1月前
|
图形学
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
|
4月前
|
前端开发 JavaScript 数据安全/隐私保护
前端点击其他输入框的时候,对当上个输入框进行判断(鼠标移出输入框事件,和鼠标点击其他输入框触发事件)
前端点击其他输入框的时候,对当上个输入框进行判断(鼠标移出输入框事件,和鼠标点击其他输入框触发事件)
86 0
|
4月前
失焦事件和点击事件
失焦事件和点击事件
30 1
|
小程序
button按钮组件
button按钮组件
用 mouse 事件写一个可拖拽的 div
用 mouse 事件写一个可拖拽的 div
75 0
|
JavaScript
使用jquery中实现按回车触发按钮事件和点击提交按钮触发的是一个事件
使用jquery中实现按回车触发按钮事件和点击提交按钮触发的是一个事件
131 0