#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, и теперь он работает. Проблема в том, что анимация не делает то, что я хотел сделать, но это просто еще одна незначительная проблема. Спасибо за вашу помощь