如何暂停Java.uti.Timer?
How to pause Java.uti.Timer?
我正在开发一个 JavaFX 应用程序,我在其中使用 java.util.Timer
来跟踪用户鼠标移动。
概念是如果鼠标在场景中几秒钟没有移动,那么只要鼠标移动按钮就会再次出现,按钮将不可见。每当用户将光标放在按钮上时,计时器将 stopped.And 退出时按钮计时器将再次启动。
这是启动定时器的方法
public static void startTimer(){
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
if(detection>0){
Util_Class.getUi_obj().getLeftbuttongroup().setVisible(false);
Util_Class.getUi_obj().getRightbuttongroup().setVisible(false);
}else{
detection++;
}
}
};
timer.schedule(task, 2000, 2000);
System.out.println("TIMER STARTED");
//startTimer();
}
这是停止计时器
public static void stopTimer(){
timer.cancel();
System.out.println("TIMER STOPED");
}
public void leftbuttonmovehandler(MouseEvent event){
if(event.getEventType()==MouseEvent.MOUSE_ENTERED){
System.out.println("MOUSE ENTERED");
Main.stopTimer();
}else if(event.getEventType()==MouseEvent.MOUSE_EXITED){
System.out.println("MOUSE EXITED");
Main.start();
}
}
现在,我的代码一开始在应用程序启动时工作正常,但当我重新加载应用程序时,回调函数按预期触发,但尽管光标位于按钮上,但按钮消失了。
如果有人能帮助我就好了。
A PauseTransition
可用于在指定时间后隐藏 Button
s。
每当触发MOUSE_MOVE
事件时,在场景中,从头开始播放PauseTransition
;如果 MOUSE_MOVE
被 Button
之一触发,则停止 PauseTransition
并阻止事件通过消耗它到达 Scene
private PauseTransition timer;
private void startTimer() {
btn.setVisible(true);
btn2.setVisible(true);
timer.playFromStart();
}
private void stopTimer() {
btn.setVisible(true);
btn2.setVisible(true);
timer.stop();
}
private Button btn, btn2;
@Override
public void start(Stage primaryStage) {
timer = new PauseTransition(Duration.seconds(3));
btn = new Button("Button 1");
btn2 = new Button("Button 2");
timer.setOnFinished(evt -> {
btn.setVisible(false);
btn2.setVisible(false);
});
EventHandler<MouseEvent> buttonMouseMoveHandler = evt -> {
evt.consume();
stopTimer();
};
btn.setOnMouseMoved(buttonMouseMoveHandler);
btn2.setOnMouseMoved(buttonMouseMoveHandler);
VBox box = new VBox(100, btn, btn2);
StackPane root = new StackPane(new Group(box));
Scene scene = new Scene(root, 500, 500);
scene.setOnMouseMoved(evt -> {
startTimer();
});
startTimer();
primaryStage.setScene(scene);
primaryStage.show();
}
我正在开发一个 JavaFX 应用程序,我在其中使用 java.util.Timer
来跟踪用户鼠标移动。
概念是如果鼠标在场景中几秒钟没有移动,那么只要鼠标移动按钮就会再次出现,按钮将不可见。每当用户将光标放在按钮上时,计时器将 stopped.And 退出时按钮计时器将再次启动。
这是启动定时器的方法
public static void startTimer(){
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
if(detection>0){
Util_Class.getUi_obj().getLeftbuttongroup().setVisible(false);
Util_Class.getUi_obj().getRightbuttongroup().setVisible(false);
}else{
detection++;
}
}
};
timer.schedule(task, 2000, 2000);
System.out.println("TIMER STARTED");
//startTimer();
}
这是停止计时器
public static void stopTimer(){
timer.cancel();
System.out.println("TIMER STOPED");
}
public void leftbuttonmovehandler(MouseEvent event){
if(event.getEventType()==MouseEvent.MOUSE_ENTERED){
System.out.println("MOUSE ENTERED");
Main.stopTimer();
}else if(event.getEventType()==MouseEvent.MOUSE_EXITED){
System.out.println("MOUSE EXITED");
Main.start();
}
}
现在,我的代码一开始在应用程序启动时工作正常,但当我重新加载应用程序时,回调函数按预期触发,但尽管光标位于按钮上,但按钮消失了。
如果有人能帮助我就好了。
A PauseTransition
可用于在指定时间后隐藏 Button
s。
每当触发MOUSE_MOVE
事件时,在场景中,从头开始播放PauseTransition
;如果 MOUSE_MOVE
被 Button
之一触发,则停止 PauseTransition
并阻止事件通过消耗它到达 Scene
private PauseTransition timer;
private void startTimer() {
btn.setVisible(true);
btn2.setVisible(true);
timer.playFromStart();
}
private void stopTimer() {
btn.setVisible(true);
btn2.setVisible(true);
timer.stop();
}
private Button btn, btn2;
@Override
public void start(Stage primaryStage) {
timer = new PauseTransition(Duration.seconds(3));
btn = new Button("Button 1");
btn2 = new Button("Button 2");
timer.setOnFinished(evt -> {
btn.setVisible(false);
btn2.setVisible(false);
});
EventHandler<MouseEvent> buttonMouseMoveHandler = evt -> {
evt.consume();
stopTimer();
};
btn.setOnMouseMoved(buttonMouseMoveHandler);
btn2.setOnMouseMoved(buttonMouseMoveHandler);
VBox box = new VBox(100, btn, btn2);
StackPane root = new StackPane(new Group(box));
Scene scene = new Scene(root, 500, 500);
scene.setOnMouseMoved(evt -> {
startTimer();
});
startTimer();
primaryStage.setScene(scene);
primaryStage.show();
}