Visualización de valores cambiantes en la etiqueta JavaFx

En JavaFX, ¿cómo puedo mostrar valores que cambian continuamente con el tiempo usando “etiqueta”?

Existen numerosas formas de lograr eso, lo más conveniente sería usar el mecanismo de unión de datos de JavaFX:

// assuming you have defined a StringProperty called "valueProperty" Label myLabel = new Label("Start"); myLabel.textProperty().bind(valueProperty); 

De esta forma, cada vez que se cambia su valueProperty llamando a su método set, el texto de la etiqueta se actualiza.

¿Qué hay de usar SimpleDateFormat? ¡No hay necesidad de la clase StringUtilities!

 private void bindToTime() { Timeline timeline = new Timeline( new KeyFrame(Duration.seconds(0), new EventHandler() { @Override public void handle(ActionEvent actionEvent) { Calendar time = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); setText(simpleDateFormat.format(time.getTime())); } } ), new KeyFrame(Duration.seconds(1)) ); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); } } 

Me gusta la respuesta vinculante de Sebastian.

Por variedad, aquí hay otra muestra de modificación de un texto de etiqueta en función del tiempo. El ejemplo muestra una lectura de reloj digital en una etiqueta cuyo texto cambia cada segundo usando una línea de tiempo .

 import java.io.IOException; import java.net.URL; import javafx.animation.*; import javafx.event.*; import javafx.scene.control.Label; import javafx.util.Duration; import java.util.Calendar; import javafx.application.Application; import javafx.scene.Scene; import javafx.stage.Stage; public class DigitalClockSample extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws IOException { stage.setScene(new Scene(new DigitalClock(), 100, 50)); stage.show(); } } /** * Creates a digital clock display as a simple label. * Format of the clock display is hh:mm:ss aa, where: * hh Hour in am/pm (1-12) * mm Minute in hour * ss Second in minute * aa Am/pm marker * Time is the system time for the local timezone. */ class DigitalClock extends Label { public DigitalClock() { bindToTime(); } // the digital clock updates once a second. private void bindToTime() { Timeline timeline = new Timeline( new KeyFrame(Duration.seconds(0), new EventHandler() { @Override public void handle(ActionEvent actionEvent) { Calendar time = Calendar.getInstance(); String hourString = StringUtilities.pad(2, ' ', time.get(Calendar.HOUR) == 0 ? "12" : time.get(Calendar.HOUR) + ""); String minuteString = StringUtilities.pad(2, '0', time.get(Calendar.MINUTE) + ""); String secondString = StringUtilities.pad(2, '0', time.get(Calendar.SECOND) + ""); String ampmString = time.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM"; setText(hourString + ":" + minuteString + ":" + secondString + " " + ampmString); } } ), new KeyFrame(Duration.seconds(1)) ); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); } } class StringUtilities { /** * Creates a string left padded to the specified width with the supplied padding character. * @param fieldWidth the length of the resultant padded string. * @param padChar a character to use for padding the string. * @param s the string to be padded. * @return the padded string. */ public static String pad(int fieldWidth, char padChar, String s) { StringBuilder sb = new StringBuilder(); for (int i = s.length(); i < fieldWidth; i++) { sb.append(padChar); } sb.append(s); return sb.toString(); } } 

Salida de muestra del reloj digital:

Salida de reloj digital

Excelentes respuestas, gracias a jewelsea por su aporte me ayudó mucho.

Actualicé DigitalClock publicado anteriormente en un formato más simple con Java 8 . Usando las adiciones de Java 8 como Date API y por supuesto las lambdas .

  import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.scene.control.Label; import javafx.util.Duration; import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class DigitalClock extends Label { private static DateTimeFormatter SHORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); public DigitalClock() { bindToTime(); } private void bindToTime() { Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0), event -> setText(LocalTime.now().format(SHORT_TIME_FORMATTER))), new KeyFrame(Duration.seconds(1))); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); } }