10 de jan. de 2017

Simples Relógio com JavaFX

O participante Welington Pietronero, do grupo JavaFX-BR, pediu um exemplo de um label que mostra as horas com JavaFX. Criamos um simples relógio:


A criação foi bem simples, segue aqui uma explicação rápida do código e em seguida o próprio código:


  • O texto vai ficar em um Label, no programa chamamos ele de lblRelogio;
  • Para transformar o objeto data em texto, precisamos de um SimpleDateFormat. Essa é uma classe bem bacana e ao criarmos uma instância da mesma, passamos uma String que representará a forma que a hora/data será representada. Há uma tabela na documentação dessa classe que mostra como podemos formatar a nossa data, no nosso caso usamos: hh:mm:ss a - que resulta no formato mostrado acima. Claro que há uma nova API de datas no Java 8, mas a API antiga ainda é muito usada!
  • No método start (se não entende o que faz esse método, por favor, veja esse post) criamos uma Font para o lblRelogio. Essa fonte aceita parâmetros que definem se a fonte ficará em negrito ou alguma variação de negrito ou se a fonte vai ficar em itálico ou normal. Lembrando que é possível usar CSS também;
  • Por fim, a chave do nosso código é a Timeline, que executa os KeyFrames no tempo passado como parâmetro. Um KeyFrame terá uma ação associada a ele e no nosso caso simplesmente chamamos o método atualizaHoras. A timeline executará "eternamente" o KeyFrame a cada 1 segundo.
Veja o codigo!

package org.fxapps.genetics;
import java.text.SimpleDateFormat;
import java.util.Date;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Relogio extends Application {
// criando o Label que vai informar as horas
private Label lblRelogio = new Label();
// SimpleDateFormat é a classe do Java que transforma datas para Strings
// usando o formato passado
private SimpleDateFormat formatador = new SimpleDateFormat("hh:mm:ss a");
// isso poderia ser emitido no Java 8
public static void main(String[] args) {
launch();
}
public void start(Stage stage) throws Exception {
// criamos a fonte usando o método de fábrica.
Font font = Font.font("Arial", FontWeight.EXTRA_BOLD, 60);
lblRelogio.setFont(font);
// vamos colocar um pequeno efeito no label pra deixar ele bonitin
lblRelogio.setEffect(new DropShadow(10, Color.RED));
// agora ligamos um loop infinito que roda a cada segundo e atualiza nosso label chamando atualizaHoras.
KeyFrame frame = new KeyFrame(Duration.millis(1000), e -> atualizaHoras());
Timeline timeline = new Timeline(frame);
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
// por fim criamos o stage, a scene com um stack pane e colocamos o nosso label lá
Scene cena = new Scene(new StackPane(lblRelogio), 450, 150);
stage.setScene(cena);
stage.show();
}
private void atualizaHoras() {
Date agora = new Date();
lblRelogio.setText(formatador.format(agora));
}
}
view raw Relogio.java hosted with ❤ by GitHub

3 comentários: