Анимация не работает на FXMLController

#javafx

#javafx

Вопрос:

Я пытаюсь анимировать фигуру, созданную в конструкторе сцен, используя класс Transition. Контроллер:

 public class Controller{

@FXML
private Line line1;

@FXML
private Line line2;

@FXML
private Line line3;

@FXML
private Rectangle rectangle1;
private double mult_factor;


private double rectangle_height;

public Controller(){
    final Animation anim = new Transition() {
        {
            setCycleDuration(Duration.millis(3000));
        }
        @Override
        protected void interpolate(double frac) {
            rectangle_height = rectangle1.getHeight();
            mult_factor = frac * 5.8;
            rectangle1.setHeight(rectangle_height * mult_factor);
        }
    };
}}
  

Основной класс:

 public class FormTest extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("The container test");
    primaryStage.setHeight(600);
    primaryStage.setWidth(600);

    Pane pane = (Pane) FXMLLoader.load(FormTest.class.getResource("conf.fxml"));
    Controller ctr = new Controller();
    primaryStage.setScene(new Scene(pane));
    primaryStage.show();

}}
  

Файл FXML:

 <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="Controller">
  <children>
    <Line fx:id="line1" endX="100.0" endY="300.0" layoutX="106.0" layoutY="70.0" startX="100.0" />
    <Line fx:id="line2" endX="100.0" endY="300.0" layoutX="300.0" layoutY="70.0" startX="100.0" />
    <Line fx:id="line3" endX="193.0" layoutX="207.0" layoutY="370.0" />
    <Rectangle fx:id="rectangle1" arcHeight="5.0" arcWidth="5.0" fill="DODGERBLUE" height="42.0" layoutX="207.0" layoutY="327.0" stroke="BLACK" strokeType="INSIDE" width="192.0" />
  </children>
</Pane>
  

Сцена просто появляется, но ничего не происходит, анимация не происходит. Что я там делаю не так?

Ответ №1:

Это должно сработать!

 public Controller(){
>     final Animation anim = new Transition() {
>         {
>             setCycleDuration(Duration.millis(3000));
>         }
>         @Override
>         protected void interpolate(double frac) {
>             rectangle_height = rectangle1.getHeight();
>             mult_factor = frac * 5.8;
>             rectangle1.setHeight(rectangle_height * mult_factor);
>         }
>     };
>   anim.play(); // <- start the actual animation
   }
}
  

Ответ №2:

Вы никогда не запускаете анимацию, которую вы можете сделать в методе Controller ‘s initialize() :

 public class Controller{

    @FXML
    private Line line1;

    @FXML
    private Line line2;

    @FXML
    private Line line3;

    @FXML
    private Rectangle rectangle1;
    private double mult_factor;


    private double rectangle_height;

    public void initialize() {
        final Animation anim = new Transition() {
            {
                setCycleDuration(Duration.millis(3000));
            }
            @Override
            protected void interpolate(double frac) {
                rectangle_height = rectangle1.getHeight();
                mult_factor = frac * 5.8;
                rectangle1.setHeight(rectangle_height * mult_factor);
            }
        };
        anim.play();
    }

}
  

Анимация, вероятно, делает не то, что вы хотите, но это, по крайней мере, заставит ее работать.

Комментарии:

1. Ну да, я этого не понял, спасибо. Но теперь я не понимаю, почему я получаю исключение NullPointerException при rectangle_height = rectangle1.getHeight();

2. Неважно, это сработало, я не добавлял метод initialize, и теперь он работает. Проблема в том, что анимация не делает то, что я хотел сделать, но это просто еще одна незначительная проблема. Спасибо за вашу помощь