2015-09-29 1 views
0

Я в настоящее время создает небольшую игру своего рода, и я создал следующий метод для начала раунда:JavaFX Bind Timeline Дисплей Выпуск

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 является свойством Property, внутри него нет встроенных операторов, таких как .divide (1000), которые я могу использовать на нем, и я не могу привязать свой текст ярлыка к самому длительности, хотя у него есть .divide (1000). Что-то мне не хватает здесь, или я должен подходить к этому совершенно по-новому? Благодарю.

ответ

1

Вы можете использовать Bindings для выполнения любого преобразования, которое вы хотите.

timeLabel.textProperty().bind(
     Bindings.createStringBinding(() -> String.format("%f", Double.valueOf(tl.currentTimeProperty().get().toMillis())/1000.0), tl.currentTimeProperty()) 
); 
0

Вы можете добавить слушателя к currentTimeProperty(), а затем использовать getCurrentTime(), чтобы установить текущее время на этикетке:

tl.currentTimeProperty().addListener(ov -> { 
    timeLabel.setText(String.valueOf((int)tl.getCurrentTime().toSeconds())) 
});