JavaFX如何在单独的类中使用AnimationTimer?

JavaFX如何在单独的类中使用AnimationTimer?,animation,javafx,keyevent,Animation,Javafx,Keyevent,使用一个简单的FXML(Volley.FXML)来获得钥匙手柄和AnimationTimer工作: 请解释您希望tp通过使用AnimationTimer实现什么?你期望它做什么?为什么在VolleyController中构造和使用AnimationTimer与在Main中不同?@c0der 1。我想使用AnimationTimer来移动我的图像,而不是我当前的方法。2.因为我是初学者,我分不清两者的区别。我所要做的就是看到命名惯例?分而治之。将复杂问题分解为较小的问题,然后一次解决一个问题。请关


使用一个简单的FXML(
Volley.FXML
)来获得钥匙手柄和
AnimationTimer
工作:


请解释您希望tp通过使用AnimationTimer实现什么?你期望它做什么?为什么在
VolleyController
中构造和使用AnimationTimer与在
Main
中不同?@c0der 1。我想使用AnimationTimer来移动我的图像,而不是我当前的方法。2.因为我是初学者,我分不清两者的区别。我所要做的就是看到命名惯例?分而治之。将复杂问题分解为较小的问题,然后一次解决一个问题。请关注你的帖子一个问题是如何使用动画定时器定期移动图像?或者如何从FXML控制器更改场景?或者如何使用钥匙?不管是什么帖子都显示了这一点。我已经重写了我的问题。希望它能被更多人接受。记住,没有人愿意费力地阅读大量无关的代码。现在就坚持java命名约定!谢谢你的回答。我是否必须在fxml文件中添加initialize()和start()方法?我正在使用SceneBuilder,但我不知道在何处添加该方法。
@FXML void initialize()
在使用控制器时会自动调用。您可以通过编辑fxml:
onAction=“#start”
或使用SceneBuilder>code>onAction来添加start:我尝试了您的代码,可以运行了。但我把它修改成截击控制器,就像上面的代码一样(我编辑了这个问题),似乎我无法达到handle方法。钥匙没有反应。有什么问题吗?不建议在回答问题后再更改,这可能会让未来的读者感到困惑。最好换一个新职位。
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>

<VBox spacing="10.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.VolleyController">
   <children>
      <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="248.0" text="Press Start.Use Arows to set direction" />
      <Pane  prefHeight="250.0" prefWidth="250.0">
         <children>
            <ImageView fx:id="ball" fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true" />
         </children>
      </Pane>
      <Button fx:id="startBtn" mnemonicParsing="false" onAction="#start" text="Start" />
   </children>
</VBox>
import javafx.animation.AnimationTimer;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;

public class VolleyController implements EventHandler<KeyEvent> {

    //always use publicly available resources when posting
    private static final String BALL = "https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/32x32/Circle_Red.png";
    boolean moveRight = false, moveLeft = false, moveUp = false, moveDown = false;
    private static final int DX = 1, DY = 1;

    @FXML
    ImageView ball;
    @FXML 
    Button startBtn;

    @FXML
    void initialize(){
        ball.setImage(new Image(BALL)); //initialize image view
    }

    @FXML
    void start(){

        ball.getScene().setOnKeyPressed(this);  //add Key press and release handlers to scene
        ball.getScene().setOnKeyReleased(this);

        //construct and invoke AnimationTimer
        AnimationTimer timer = new AnimationTimer(){
            @Override
            public void handle(long now) {
                move();  //repeatedly invoke move
            }
        };
        timer.start();

        startBtn.setDisable(true);
    }

    @Override
    public void handle(KeyEvent e) {
         moveRight = false; moveLeft = false;  moveUp = false; moveDown = false;
        //change movement directions based on key events
        switch (e.getCode()) {
            case UP:
                moveUp = true;
                break;
            case LEFT:
                moveLeft = true;
                break;
            case RIGHT:
                moveRight = true;
                break;
            case DOWN:
                moveDown = true;
                break;
        }
    }

    //move if any of the direction control booleans is true
    private void move() {
        if(moveLeft) {
            ball.setLayoutX(ball.getLayoutX()-DX);
        }else  if(moveRight) {
            ball.setLayoutX(ball.getLayoutX()+DX);
        }else if(moveDown) {
            ball.setLayoutY(ball.getLayoutY()+DY);
        }else if(moveUp) {
            ball.setLayoutY(ball.getLayoutY()-DY);
        }
    }
}
public class Main extends Application {

    @Override
    public void start(Stage currentStage) throws Exception {

        Parent root=FXMLLoader.load(getClass().getResource("Volley.fxml"));
        currentStage.setScene(new Scene(root));
        currentStage.show();
    }

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