我有一个矩形框作为我的对象和一个按钮。此后,我创建了一个场景,并将框和按钮添加到画布中。
第一次单击该按钮后,该框开始移动,第二次单击该按钮后,该框应停止移动,但仍会继续。
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();
}
}
该框应在偶数点击时停止,并在奇数点击时开始移动。
答案 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); }
}