阻止盒子移动

时间:2019-07-09 17:20:09

标签: javafx

我有一个矩形框作为我的对象和一个按钮。此后,我创建了一个场景,并将框和按钮添加到画布中。

第一次单击该按钮后,该框开始移动,第二次单击该按钮后,该框应停止移动,但仍会继续。

    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 个答案:

答案 0 :(得分:1)

好吧,看来您刚刚开始编码并不一定是一件坏事,但是您应该做一些事情来作为良好的编码实践

if(a==1) {这应该是一个布尔如果那是什么您使用它你鸵鸟政策需要一个INT来存储对象是否是移动一个布尔会做得很好正如@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); }
}