问题分析
长按按钮 一直不停的触发事件
分析问题
- 需要监听鼠标按下事件。
- 需要在监听到鼠标按下时候一直触发 按钮的
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*/publicabstractclassAnimationTimer
通过继承 AnimationTimer
实现一个执行按钮事件的Timer
classExecuteTimerextendsAnimationTimer { privatelonglastUpdate=0L; privateButtonmbtn; publicExecuteTimer(Buttonbutton) { this.mbtn=button; } publicvoidhandle(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; } publicvoidhandle(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 { publicvoidstart(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(); } }