如何在按下按钮时移动形状JavaFx

时间:2017-03-04 20:59:59

标签: java javafx timer eventhandler

我试图让一个圆圈移动到我按下按钮时逐个像素定义的方向。到目前为止,我已设法通过每次点击使其移动一个像素:

button1.addEventHandler(MouseEvent.MOUSE_PRESSED,
                new EventHandler<MouseEvent>(){
            public void handle(MouseEvent e){
newX = pallo.getTranslateX()+ 1 ;
                pallo.setTranslateX(newX);

            }
        });

pallo就是这里的圆圈,button1是导致它移动的按钮。我一直在阅读这里的计时器方法https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html,但我一直无法理解我应该输入的重复序列的说法,每10毫秒一次,只有当按钮正在按下。 有人能为我提供固定代码,将功能更改为我所寻求的功能,以便我可以尝试用它来理解它吗?

1 个答案:

答案 0 :(得分:2)

如果您想坚持使用Timer课程,您可以执行以下操作:

public class TimerExample {

    private final Timer timer = new Timer();
    private TimerTask timerTask;

    public void setUpButton(Button btn, Circle cir) {
        btn.addEventHandler(MouseEvent.MOUSE_PRESSED, me -> {
            timerTask = new TimerTask() {

                @Override
                public void run() {
                    Platform.runLater(() 
                         -> circle.setTranslateX(circle.getTranslateX() + 1);
                }

            };
            timer.schedule(timerTask, 0L, 10L);
        });

        btn.addEventHandler(MouseEvent.MOUSE_RELEASED, me -> {
            timerTask.cancel();
            timerTask = null;
            timer.purge(); // So TimerTasks don't build up inside the Timer
                           // I'm not 100% sure this must/should be called
                           // every time
        });
    }
}

使用Timer时,您必须安排TimerTasks。正如您所看到的,我使用了timer.schedule(timerTask, 0L, 10L),这意味着timerTask将在0 milliseconds的初始延迟之后运行,然后在10 milliseconds之后运行。按下按钮时会发生此调度。当鼠标被释放时,TimerTask被取消(不会再次运行),然后我将变量设置为null并清除Timer以删除对TimerTask的任何引用。

run方法中,您必须操纵Platform.runLater(Runnable)中的圈子,因为不会在FxApplication线程上调用TimerTask

就个人而言,如果坚持像计时器这样的东西,我宁愿使用javafx.animation.AnimationTimer。这是因为AnimationTimer的{​​{1}}方法每帧都在FxApplication Thread 上调用

这样的事情:

handle(long)

在这里,您必须根据延迟手动计算何时运行,但这可以避免任何线程问题。