我正在创建一个小型的游戏,我已经创建了以下方法来开始一轮:
private void startRound(){
int playerStarting = rnd.nextInt(2) + 1;
imageBox.managedProperty().bind(imageBox.visibleProperty());
imageBox.setVisible(false);
VBox timeBox = new VBox();
Label timeLabel = new Label();
timeLabel.setId("RoundTimer-Label");
timeBox.setAlignment(Pos.CENTER);
timeBox.getChildren().add(timeLabel);
gr.add(timeBox, 1, 0, 1, 4);
Timeline tl = new Timeline(1);
tl.getKeyFrames().add(new KeyFrame(Duration.seconds(3)));
timeLabel.textProperty().bind(tl.currentTimeProperty().asString());
tl.playFromStart();
timeLabel = null;
timeBox = null;
imageBox.setVisible(true);
}
除了一个问题外,一切都正常运行。
tl.currentTimeProperty().asString();
将数字显示为1000.7毫秒和2001毫秒,我强烈希望如果不是这样的话。但是因为currentTimeProperty是一个属性,所以我没有像.divide(1000)这样的内置运算符可以在它上面使用,而且我不能将我的标签文本绑定到Duration本身,即使它确实有.divide( 1000)方法。有什么我在这里缺少的或者我应该采用一种全新的方式吗?感谢。
答案 0 :(得分:1)
您可以使用Bindings进行所需的任何转换。
timeLabel.textProperty().bind(
Bindings.createStringBinding(() -> String.format("%f", Double.valueOf(tl.currentTimeProperty().get().toMillis())/1000.0), tl.currentTimeProperty())
);
答案 1 :(得分:0)
您可以向currentTimeProperty()
添加一个监听器,然后使用getCurrentTime()
设置标签上的当前时间:
tl.currentTimeProperty().addListener(ov -> {
timeLabel.setText(String.valueOf((int)tl.getCurrentTime().toSeconds()))
});