Остановка коробки от перемещения - PullRequest
1 голос
/ 09 июля 2019

У меня есть прямоугольник с моим объектом и кнопка.После этого я создал сцену и добавил поле и кнопку на холст.

После первого нажатия кнопки окно начинает двигаться, а после второго нажатия кнопки оно должно перестать двигаться, ноэто продолжается.

    import javafx.animation.Animation;
    import javafx.animation.KeyFrame;
    import javafx.animation.KeyValue;
    import javafx.animation.Timeline;
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Bounds;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Circle;
    import javafx.scene.shape.Rectangle;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    import javafx.scene.control.Button;
    import java.awt.*;

    import static java.awt.Color.RED;

    public class Main extends Application implements EventHandler<ActionEvent> {

    Button btn = new Button();
    Pane canvas = new Pane();
    Rectangle box = new Rectangle(5, 10, 20, 30);
    int a=0;

    public void start(Stage stage) throws Exception 
    {

        Scene scene = new Scene(canvas, 800, 600);
        box.setFill(Color.rgb(255,0,0));
        box.relocate(100, 550);
        canvas.getChildren().addAll(box, btn);

        stage.setTitle("Moving Ball");
        stage.setScene(scene);
        stage.show();

        btn.setOnAction(this);

    }

    @Override
    public void handle (ActionEvent event)
    {
        Bounds bounds = canvas.getBoundsInLocal();
        Timeline timeline=new Timeline();

        if(a==1) 
        {
            a=0;

            timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(10),
                    new KeyValue(box.layoutXProperty() , box.getX())))

            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();

        }
        else
        {
            a=1;

            timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(10),
                   new KeyValue(box.layoutXProperty(), bounds.getMaxY() - box.getWidth())));

            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();

        }
    }

    public static void main(String[] args) {
        launch();
    }
}

Поле должно останавливаться при щелчках с четными номерами и начинать движение при щелчках с нечетными номерами.

1 Ответ

1 голос
/ 09 июля 2019

Хорошо, похоже, вы только что начали кодировать, что не обязательно плохо, но есть некоторые вещи, которые вы должны сделать, как хорошая практика кодирования

Такие, как if(a==1) { ЭТО ДОЛЖНО булева Если то, что ваш использовать его для вам не нужен ИНТ используется для занесения Если объект, отведя булевой все будет хорошо, как сказал @Sedrick в комментарии ниже «вы мог бы использовать getStatus () ", что имеет больше смысла, потому что тогда вам не нужно переворачивать логическое значение или изменять int каждый раз

public final Animation.Status getStatus () Получает значение статуса свойства. Описание свойства: Статус анимации. В анимации может находиться в одном из трех состояний: Animation.Status.STOPPED, Animation.Status.PAUSED или Animation.Status.RUNNING

Далее прочитайте больше об обработчиках событий, которые вам не нужны implements EventHandler<ActionEvent>, чтобы обработать действие, вы можете сделать что-то вроде этого btn.setOnAction(event -> handle(event));

После этого вам не нужно создавать новую временную шкалу каждый раз, когда вы нажимаете кнопку, просто инициализируйте ее один раз и оставьте на этом

Переходя к Timeline с, чтобы остановить Timeline, вы просто делаете timeline.stop();

Итак, когда вы соберете все вместе, это будет выглядеть примерно так:

public class Main extends Application {

    private Button btn = new Button();
    private Pane canvas = new Pane();
    private Rectangle box = new Rectangle(5, 10, 20, 30);
    private Timeline timeline=new Timeline();
    //int a=0;
    private boolean isMoving = false;

    @Override
    public void start(Stage stage) {
        box.setFill(Color.rgb(255,0,0));
        box.relocate(100, 550);
        canvas.getChildren().addAll(box, btn);

        Scene scene = new Scene(canvas, 800, 600);


        stage.setTitle("Moving Ball");
        stage.setScene(scene);
        stage.show();

        Bounds bounds = canvas.getBoundsInLocal();
        timeline.getKeyFrames().add(
                new KeyFrame(Duration.seconds(10),
                        new KeyValue(box.layoutXProperty(), bounds.getMaxX() - box.getWidth())));
        timeline.setCycleCount(Animation.INDEFINITE);

        btn.setOnAction(event -> handle());
    }

    private void handle() {
        if(timeline.getStatus()== Animation.Status.RUNNING) {
            //a=0;
            //timeline.getKeyFrames().add(
            //        new KeyFrame(Duration.seconds(10), new KeyValue(box.layoutXProperty() , box.getX()))
            //);
            //timeline.setCycleCount(Animation.INDEFINITE);
            //timeline.play();
            //isMoving = false;
            timeline.stop();

        }
        else {
            //a=1;
            //isMoving = true;
            timeline.play();
        }
    }

    public static void main(String[] args) { launch(args); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...