JavaFXTimeline通过多个侦听器时停止播放

JavaFXTimeline通过多个侦听器时停止播放,java,javafx,javafx-8,Java,Javafx,Javafx 8,我是一个刚开始学习JavaFX的初学者,我一直在尝试制作一个程序,在点击一个节点时,在该节点上执行一个动画。我试着看看是否有其他人也尝试过类似的事情,但我没有找到一个与我尝试过的类似的案例 时间轴在屏幕上水平地为窗格(包含矩形和文本)设置动画,在完成执行后,舞台将改变场景。当用户单击按钮返回原始场景时,按钮应执行另一个动画 我已经验证了不是场景转换导致它停止,我还验证了程序确实在时间轴上执行.play()。时间线在自定义侦听器中执行,因此就我所知,侦听器不是问题 下面是代码示例,用于重新创建我遇

我是一个刚开始学习JavaFX的初学者,我一直在尝试制作一个程序,在点击一个节点时,在该节点上执行一个动画。我试着看看是否有其他人也尝试过类似的事情,但我没有找到一个与我尝试过的类似的案例

时间轴在屏幕上水平地为窗格(包含矩形和文本)设置动画,在完成执行后,舞台将改变场景。当用户单击按钮返回原始场景时,按钮应执行另一个动画

我已经验证了不是场景转换导致它停止,我还验证了程序确实在时间轴上执行
.play()
。时间线在自定义侦听器中执行,因此就我所知,侦听器不是问题

下面是代码示例,用于重新创建我遇到的问题,运行脚本,然后继续。在这里,您可以看到
done
正在打印到控制台,控制台就在
Main_按钮_Animation.play()的正下方但是,没有设置任何动画

import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;

public class main extends Application{
    Scene scene1;

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("test");
        Main_Screen MainScreen = new Main_Screen(800, 480);

        scene1 = MainScreen.MainScreen(primaryStage);
        MainScreen.getInitiater().Calibration_Listener(() -> {
            MainScreen.getInitiater().Back_Button_Pressed();
        });

        primaryStage.setScene(scene1);
        primaryStage.show();
    }
    public static void main(String[] args) {
        Application.launch(args);
    }
}
//custom listeners
interface Calibration {
    void menu();
}
interface Back {
    void back();
}
class Initiater {
    private List<Calibration> calilist = new ArrayList<Calibration>();;
    private List<Back> Go_Back = new ArrayList<Back>();

    public void Calibration_Listener(Calibration toAdd) {
        calilist.add(toAdd);
    }
    public void Back_Listener(Back toAdd) {
        Go_Back.add(toAdd);
    }

    public void Calibration_Pressed() {
        System.out.println("Calibration Pressed");
        for (Calibration hl : calilist)
            hl.menu();
    }
    public void Back_Button_Pressed() {
        System.out.println("Back Pressed");
        for (Back hl : Go_Back)
            hl.back();
    }
}

//animations and setup
class Main_Screen {
    Initiater initiater;
    private int X;
    private int Y;

    public Main_Screen(int X, int Y) {
        this.initiater = new Initiater();
        this.X = X;
        this.Y = Y;
    }

    private Pane UI_Button(String name, int[] pos, int[] size, Color color) {
        final Text text = new Text(0, 0, name);
        text.setFont(new Font(20));

        final Rectangle outline = new Rectangle(0, 0, size[0], size[1]);
        outline.setFill(color);

        final StackPane stack = new StackPane();
        stack.getChildren().addAll(outline, text);
        stack.setLayoutX(pos[0]);
        stack.setLayoutY(pos[1]);

        return stack;
    }

    public int getX() {
        return this.X;
    }

    public int getY() {
        return this.Y;
    }

    public Initiater getInitiater() {
        return this.initiater;
    }

    public Scene MainScreen(Stage stage) {
        Scene scene = new Scene(new Group(), getX(), getY());
        scene.setFill(Color.WHITE);

        Pane Start = UI_Button("Start", new int[] { getX() - getX() / 4, 0 }, new int[] { getX() / 4, getY() / 4 }, Color.rgb(255, 0, 0));
        Pane Calibration = UI_Button("Callibration", new int[] { 0, ((getY() + (getY() / 8)) / 4) * 0 }, new int[] { getX() / 2, getY() / 4 }, Color.rgb(60, 208, 230));

        System.out.println(Calibration.boundsInLocalProperty());
        ((Group) scene.getRoot()).getChildren().addAll(Calibration, Start);

        final Timeline Main_Button_Animation = new Timeline();
        final KeyFrame Cali_kf = new KeyFrame(Duration.millis(500), new KeyValue(Calibration.translateXProperty(), getX() / 2));
        final KeyFrame Start_kf = new KeyFrame(Duration.millis(500), new KeyValue(Start.translateXProperty(), -getX() / 4));
        Main_Button_Animation.getKeyFrames().addAll(Cali_kf, Start_kf);
        Main_Button_Animation.setRate(-1);
        Main_Button_Animation.jumpTo(Main_Button_Animation.getTotalDuration());
        Main_Button_Animation.play();

        Calibration.setOnMouseClicked(MouseEvent -> {
            Calibration.setDisable(true);
            Start.setDisable(true);
            System.out.println(Calibration.boundsInLocalProperty());
            Main_Button_Animation.setRate(1);
            Main_Button_Animation.jumpTo(Duration.millis(0));
            Main_Button_Animation.play();
            Main_Button_Animation.setOnFinished(event -> {
                Main_Button_Animation.play();
                System.out.println("done");
            });
        });     
        return scene;
    }

}
import java.util.ArrayList;
导入java.util.List;
导入javafx.animation.KeyFrame;
导入javafx.animation.KeyValue;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.Font;
导入javafx.scene.text.text;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类主扩展应用程序{
场景1;
@凌驾
公共无效开始(阶段primaryStage){
初级阶段。设置标题(“测试”);
主屏幕主屏幕=新主屏幕(800480);
场景1=主屏幕。主屏幕(初级阶段);
MainScreen.GetInitiator().Calibration_侦听器(()->{
MainScreen.GetInitiator().按下后退按钮();
});
初生阶段:场景1;
primaryStage.show();
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
}
//自定义侦听器
接口校准{
无效菜单();
}
接口返回{
空背();
}
类发起者{
私有列表calilist=newarraylist();;
private List Go_Back=new ArrayList();
公共无效校准\u侦听器(校准到添加){
calilist.add(toAdd);
}
公共无效返回\u侦听器(返回到添加){
返回。添加(toAdd);
}
公共空间校准(按){
系统输出打印项次(“校准按下”);
用于(校准hl:校准列表)
hl.menu();
}
公共作废后退按钮按下(){
System.out.println(“反压”);
用于(返回hl:返回)
hl.back();
}
}
//动画和设置
类主屏幕{
引发剂;
私人INTX;
私营企业;
公共主屏幕(整数X,整数Y){
this.initiator=新启动器();
这个.X=X;
这个。Y=Y;
}
专用窗格UI_按钮(字符串名称、int[]位置、int[]大小、颜色){
最终文本=新文本(0,0,名称);
text.setFont(新字体(20));
最终矩形轮廓=新矩形(0,0,大小[0],大小[1]);
轮廓。设置填充(颜色);
最终StackPane堆栈=新StackPane();
stack.getChildren().addAll(大纲,文本);
stack.setLayoutX(位置[0]);
stack.setLayoutY(位置[1]);
返回栈;
}
公共int getX(){
归还这个.X;
}
公共int getY(){
把这个还给我;
}
公共启动器getInitiator(){
返回此.initiator;
}
公共场景主屏幕(舞台){
场景=新场景(新组(),getX(),getY());
场景。设置填充(颜色。白色);
窗格Start=UI_按钮(“Start”,新int[]{getX()-getX()/4,0},新int[]{getX()/4,getY()/4},Color.rgb(255,0,0));
窗格校准=UI_按钮(“校准”,新int[]{0,((getY()+(getY()/8))/4)*0},新int[]{getX()/2,getY()/4},Color.rgb(60,208,230));
System.out.println(Calibration.boundsInLocalProperty());
((组)scene.getRoot()).getChildren().addAll(校准,开始);
最终时间线主按钮动画=新时间线();
final KeyFrame Cali_kf=新的关键帧(Duration.millis(500),new KeyValue(Calibration.translateProperty(),getX()/2));
final KeyFrame Start_kf=新的关键帧(Duration.millis(500),new KeyValue(Start.translateProperty(),-getX()/4));
主按钮动画。getKeyFrames().addAll(Cali_kf,Start_kf);
主按钮动画设置速率(-1);
Main_Button_Animation.jumpTo(Main_Button_Animation.getTotalDuration());
主按钮动画。播放();
校准。设置鼠标点击(鼠标事件->{
校准。设置禁用(真);
Start.setDisable(true);
System.out.println(Calibration.boundsInLocalProperty());
主按钮动画设置(1);
主按钮动画。跳到(持续时间。毫秒(0));
主按钮动画。播放();
主按钮动画。设置完成(事件->{
主按钮动画。播放();
系统输出打印项次(“完成”);
});
});     
返回场景;
}
}
Edit1:为清晰起见,上面的示例不使用任何场景转换。下面是一个场景转换的示例

import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;

public class main extends Application{
    Scene scene1, scene2;

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("test");
        Main_Screen MainScreen = new Main_Screen(800, 480);

        scene1 = MainScreen.MainScreen(primaryStage);
        MainScreen.getInitiater().Calibration_Listener(() -> {
            primaryStage.setScene(scene2);
            primaryStage.show();
        });

        Label label2 = new Label("This is the second scene");
        Button button2 = new Button("Go to scene 1");
        button2.setOnAction(e -> {
            MainScreen.getInitiater().Back_Button_Pressed();
            primaryStage.setScene(scene1);
            primaryStage.show();
        });
        VBox layout2 = new VBox(20);
        layout2.getChildren().addAll(label2, button2);
        scene2 = new Scene(layout2, 800, 480);

        primaryStage.setScene(scene1);
        primaryStage.show();
    }
    public static void main(String[] args) {
        Application.launch(args);
    }
}
//custom listeners
interface Calibration {
    void menu();
}
interface Back {
    void back();
}
class Initiater {
    private List<Calibration> calilist = new ArrayList<Calibration>();;
    private List<Back> Go_Back = new ArrayList<Back>();

    public void Calibration_Listener(Calibration toAdd) {
        calilist.add(toAdd);
    }
    public void Back_Listener(Back toAdd) {
        Go_Back.add(toAdd);
    }

    public void Calibration_Pressed() {
        System.out.println("Calibration Pressed");
        for (Calibration hl : calilist)
            hl.menu();
    }
    public void Back_Button_Pressed() {
        System.out.println("Back Pressed");
        for (Back hl : Go_Back)
            hl.back();
    }
}

//animations and setup
class Main_Screen {
    Initiater initiater;
    private int X;
    private int Y;

    public Main_Screen(int X, int Y) {
        this.initiater = new Initiater();
        this.X = X;
        this.Y = Y;
    }

    private Pane UI_Button(String name, int[] pos, int[] size, Color color) {
        final Text text = new Text(0, 0, name);
        text.setFont(new Font(20));

        final Rectangle outline = new Rectangle(0, 0, size[0], size[1]);
        outline.setFill(color);

        final StackPane stack = new StackPane();
        stack.getChildren().addAll(outline, text);
        stack.setLayoutX(pos[0]);
        stack.setLayoutY(pos[1]);

        return stack;
    }

    public int getX() {
        return this.X;
    }

    public int getY() {
        return this.Y;
    }

    public Initiater getInitiater() {
        return this.initiater;
    }

    public Scene MainScreen(Stage stage) {
        Scene scene = new Scene(new Group(), getX(), getY());
        scene.setFill(Color.WHITE);

        Pane Start = UI_Button("Start", new int[] { getX() - getX() / 4, 0 }, new int[] { getX() / 4, getY() / 4 }, Color.rgb(255, 0, 0));
        Pane Calibration = UI_Button("Callibration", new int[] { 0, ((getY() + (getY() / 8)) / 4) * 0 }, new int[] { getX() / 2, getY() / 4 }, Color.rgb(60, 208, 230));

        System.out.println(Calibration.boundsInLocalProperty());
        ((Group) scene.getRoot()).getChildren().addAll(Calibration, Start);

        final Timeline Main_Button_Animation = new Timeline();
        final KeyFrame Cali_kf = new KeyFrame(Duration.millis(500), new KeyValue(Calibration.translateXProperty(), getX() / 2));
        final KeyFrame Start_kf = new KeyFrame(Duration.millis(500), new KeyValue(Start.translateXProperty(), -getX() / 4));
        Main_Button_Animation.getKeyFrames().addAll(Cali_kf, Start_kf);
        Main_Button_Animation.setRate(-1);
        Main_Button_Animation.jumpTo(Main_Button_Animation.getTotalDuration());
        Main_Button_Animation.play();

        Calibration.setOnMouseClicked(MouseEvent -> {
            Calibration.setDisable(true);
            Start.setDisable(true);
            System.out.println(Calibration.boundsInLocalProperty());
            Main_Button_Animation.setRate(1);
            Main_Button_Animation.jumpTo(Duration.millis(0));
            Main_Button_Animation.play();
            Main_Button_Animation.setOnFinished(event -> {
                this.initiater.Calibration_Pressed();
                System.out.println("done");
            });
        });
        this.initiater.Back_Listener(() -> {
            Main_Button_Animation.setRate(-1);
            Main_Button_Animation.jumpTo(Main_Button_Animation.getTotalDuration());
            Main_Button_Animation.play();
            Main_Button_Animation.setOnFinished(e -> {
                Calibration.setDisable(false);
                Start.setDisable(false);
            });
        });
        return scene;
    }

}
import java.util.ArrayList;
导入java.util.List;
导入javafx.animation.KeyFrame;
导入javafx.animation.KeyValue;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
英普
public Scene MainScreen(Stage stage) {
    final Group root = new Group();

    Scene scene = new Scene(root, getX(), getY());
    scene.setFill(Color.WHITE);

    Pane Start = UI_Button("Start", new int[] { getX() * 3 / 4, 0 }, new int[] { getX() / 4, getY() / 4 }, Color.RED);
    Pane Calibration = UI_Button("Callibration", new int[] { 0, 0 }, new int[] { getX() / 2, getY() / 4 }, Color.rgb(60, 208, 230));

    System.out.println(Calibration.boundsInLocalProperty());
    root.getChildren().addAll(Calibration, Start);

    final Timeline Main_Button_Animation = new Timeline(
            new KeyFrame(Duration.ZERO,
                    new KeyValue(Calibration.translateXProperty(), 0),
                    new KeyValue(Start.translateXProperty(), 0)),
            new KeyFrame(Duration.millis(500),
                    new KeyValue(Calibration.translateXProperty(), getX() / 2),
                    new KeyValue(Start.translateXProperty(), -getX() / 4)));

    Main_Button_Animation.setRate(-1);
    Main_Button_Animation.playFrom(Main_Button_Animation.getTotalDuration());

    Calibration.setOnMouseClicked(MouseEvent -> {
        Calibration.setDisable(true);
        Start.setDisable(true);
        System.out.println(Calibration.boundsInLocalProperty());
        Main_Button_Animation.playFromStart();
        Main_Button_Animation.setOnFinished(event -> {
            this.initiater.Calibration_Pressed();
            System.out.println("done");
        });
    });
    this.initiater.Back_Listener(() -> {
        Main_Button_Animation.setRate(-1);
        Main_Button_Animation.playFrom(Main_Button_Animation.getTotalDuration());
        Main_Button_Animation.setOnFinished(e -> {
            Calibration.setDisable(false);
            Start.setDisable(false);
        });
    });
    return scene;
}