Visualizzazione dei valori che cambiano nell’etichetta JavaFx

In JavaFX, come posso visualizzare valori che cambiano continuamente nel tempo usando “etichetta”?

Ci sono molti modi per farlo, il più conveniente sarebbe usare il meccanismo DataBinding di JavaFX:

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

In questo modo, ogni volta che valueProperty viene modificato chiamando il metodo set, il testo dell’etichetta viene aggiornato.

Che ne dici di usare SimpleDateFormat? Non c’è bisogno della class 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(); } } 

Mi piace la risposta vincolante di Sebastian.

Per varietà, ecco un altro esempio di modifica di un testo di etichetta basato sul tempo. L’esempio mostra una lettura digitale dell’orologio in un’etichetta il cui testo cambia ogni secondo utilizzando una linea temporale .

 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(); } } 

Uscita campione dell'orologio digitale:

Uscita digitale dell'orologio

Risposte eccellenti, grazie per il tuo contributo, mi ha aiutato molto.

Ho aggiornato il DigitalClock pubblicato in precedenza in un formato più snello utilizzando Java 8 . Usando le aggiunte di Java 8 come Date API e, naturalmente, i lambda .

  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(); } }