在时间轴之后获取int的值

时间:2018-03-16 11:19:21

标签: java javafx timeline

我有一个应用程序,其目标是掷骰子,我使用TimeLine,但我不知道如何在另一个类的最后得到骰子的价值。 这是我的代码: 在班级骰子

private List <Image> listeFaceDice;
private int randomNum;
private ImageView imageView;
public void dropDice(){
    Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0.5), event -> {
        setRandomNum(rand.nextInt(6);
        imageView.setImage(listeFaceDice.get(randomNum-1));
    }));
    timeline.setCycleCount(6);
    timeline.play();
    timeline.setOnFinished(e -> {
        setRandomNum(randomNum);
    });

}

在课堂游戏中

public Button getBtnDropDice() {
    if(btnDropDice == null) {
        btnDropDice = new Button("Drop dice");
        btnDropDice.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                Dice dice = new Dice();
                    dice.dropDice();
                    System.out.println(dice.getRandomNum());
            }
        });
    }
    return btnDropDice;
}

1 个答案:

答案 0 :(得分:0)

一旦完成骰子滚动,你实际上已经访问了该值:你只是不对它做任何事情(除了调用setRandomNum(...),当你传递已经设置的值时,它不会做任何事情)。

如果用System.out.println(...)替换该处理程序,您将在控制台中看到该值:

timeline.setOnFinished(e -> {
    System.out.println(randomNum);
});

如果你想在调用类中做一些事情,首先要注意dropDice()方法将立即退出(即在动画完成之前)。您可以做的一件事是将dropDice()方法传递给处理结果的函数:

public void dropDice(IntConsumer valueProcessor){
    Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0.5), event -> {
        setRandomNum(rand.nextInt(6);
        imageView.setImage(listeFaceDice.get(randomNum-1));
    }));
    timeline.setCycleCount(6);
    timeline.play();
    timeline.setOnFinished(e -> {
        valueProcessor.accept(randomNum);
    });

}

现在你可以做到:

Dice dice = new Dice();
dice.dropDice(diceValue -> {
    // do whatever you need to do with diceValue here. 
    // Just as a demo:
    System.out.println("Value rolled was "+diceValue);
});

此处传递给accept(...)的函数(更确切地说,IntConsumer中的dropDice()方法)将在FX应用程序线程上调用(因此可以安全地更新UI )骰子卷完成后。