Как заставить графики перестать слипаться? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть проект javafx, в котором есть круг и четыре кнопки (влево, вправо, вверх, вниз). При нажатии кнопки круг начнет двигаться в направлении кнопки. Если вы нажмете другую кнопку, круг должен изменить направление. Если вы нажмете на круг, он станет красным, а временная шкала остановится. Проблема заключается в том, что каждый раз, когда вы нажимаете кнопку во второй раз, она обновляет временную шкалу, но она создает другую временную шкалу, и круг становится пустым.

Я пытался остановить график каждый раз, когда кто-то нажимал кнопку, но не работал.

Timeline animation;
btnL.setOnAction(e -> {
 if(check == false){
  animation = new Timeline(new KeyFrame(Duration.millis(50), f->  moveBall('l')));
  animation.setCycleCount(Timeline.INDEFINITE);
  animation.play();
  check = true;
 }
});
btnR.setOnAction(e -> {
 if(check == false){
  animation = new Timeline(new KeyFrame(Duration.millis(50), f-> moveBall('r')));
  animation.setCycleCount(Timeline.INDEFINITE);
  animation.play();
  check = true;
 }
});
btnU.setOnAction(e -> {
 if(check == false){
  animation = new Timeline(new KeyFrame(Duration.millis(50), f-> 
moveBall('u')));
  animation.setCycleCount(Timeline.INDEFINITE);
  animation.play();
  check = true;
 }
});
btnD.setOnAction(e -> {
 if(check == false){
  animation = new Timeline(new KeyFrame(Duration.millis(50), f-> moveBall('d')));
  animation.setCycleCount(Timeline.INDEFINITE);
  animation.play();
  check = true;
 }
});
circle.setOnMouseClicked(e -> {
 circle.setFill(Color.RED);
 animation.stop();
 check = false;
});

В конце я сделал логическую проверку, чтобы проверить, нажал ли кто-то кнопку и движется ли шар, любая другая кнопка ничего не сделает. Но я считаю, что есть более правильное решение.

1 Ответ

4 голосов
/ 30 мая 2019

Остановка временной шкалы перед созданием новой должна работать:

btnL.setOnAction(e -> {
    if(!check) {
        if (animation != null) {
            animation.stop(); // stop old animation
        }
        animation = new Timeline(new KeyFrame(Duration.millis(50), f->  moveBall('l')));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
        check = true;
    }
});

Поскольку вы изменяете только то, что char вы передаете moveBall, вы можете просто сохранить это значение вполе и использовать только один Timeline:

private char direction = 0;
private final Timeline animation = new Timeline(new KeyFrame(Duration.millis(50), f-> moveBall(direction)));

{
    animation.setCycleCount(Timeline.INDEFINITE);
}

private void setDirection(char direction) {
    if (!check) {
        this.direction = direction;
        animation.playFromStart();
        check = true;
    }
}
btnL.setOnAction(e -> setDirection('l'));
btnR.setOnAction(e -> setDirection('r'));
...

Примечание: Я предполагаю, что check установлен в false где-то в коде, который у вас естьне показано.В противном случае только щелчок по кругу позволяет другим нажатиям кнопки для другого нажатия кнопки иметь эффект после начального.Если нет, просто удалите if и назначение и оставьте только остальную часть тела if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...