2015-05-25 142 views
0

我正在尝试使对象在屏幕上移动,只改变其x值的应用程序。我没有收到任何错误,但是当我运行它时它不工作。对象正在显示,但矩形不是动画。我不知道该怎么办JavaFX动画无法正常工作

import javafx.animation.Animation; 
import javafx.animation.KeyFrame; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class Main extends Application { 

    private BorderPane root; 
    private Stage stage; 
    private Scene scene; 
    private AnchorPane anchorPane; 
    private Rectangle player; 
    private Circle circles; 
    private Button up, down; 
    private Timeline timer; 

    @Override 
    public void start(Stage primaryStage) { 
     stage = primaryStage; 
     root = new BorderPane(); 
     scene = new Scene(root, 600, 500); //width and height of application 
     stage.setScene(scene); 
     stage.setTitle("Hoop runner"); //text for the title bar of the window 

     scene.getStylesheets().add("hoop.css"); 

     anchorPane = new AnchorPane(); 
     anchorPane.setMaxHeight(500); 
     anchorPane.setMinHeight(500); 
     anchorPane.setMinWidth(600); 
     anchorPane.setMaxWidth(600); 
     player = new Rectangle(); 
     circles = new Circle(); 
     up = new Button("˄"); 
     down = new Button("˅"); 


     root.setCenter(new VBox(new VBox(circles), 
       new HBox(player))); 

     root.setCenter(anchorPane); 

     player.setX(5); 
     player.setY(380); 
     player.setHeight(80); 
     player.setWidth(120); 
     anchorPane.getChildren().add(player); 

     timer = new Timeline(Animation.INDEFINITE); 

     timer.setCycleCount(Animation.INDEFINITE); 

     timer.getKeyFrames().add(new KeyFrame(Duration.INDEFINITE, event -> maverick())); 


     timer.play(); 







     stage.show(); 




    } 

    private void maverick() { 




      timer.play(); 
      System.out.println("hi"); 
      player.setX(player.getX() + 2); 
      timer.play(); 

    } 


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

回答

0
  • 使用setTranslateX而不是setX如果要定位或动画节点。
  • 更改timer = new Timeline(Animation.INDEFINITE)timer = new Timeline()。 (例如)
  • 变化new KeyFrame(Duration.INDEFINITE, event -> maverick())变为new KeyFrame(Duration.millis(500), event -> maverick())(例如)。

KeyFrame必须有一个时间点。如果像例子那样使用500ms,那么KeyFrame的EventHandler将在500ms后被调用。由于您的TimeLine具有INDEFINITE的cycleCount,它将每500ms循环并执行KeyFrame。

+0

在做出上述更改后,我的对象能够移动一次,但之后停止。我如何让它继续移动? –

+0

您是否删除了'timer.setCycleCount(Animation.INDEFINITE);'?你不应该。这仍然需要告诉时间线循环,所以关键帧每500ms发生一次,而不是在500ms之后发生一次。 –