Orologio
analogico e digitale in java
Le date in java
La classe GregorianCalendar espone il
metodo get per accedere velocemente a ora,
minuti, secondi, millisecondi, giorno, giorno
della settimana, giorno dell’anno, ecc.
GregorianCalendar gc = new GregorianCalendar();
int h = gc.get(GregorianCalendar.HOUR_OF_DAY);
In particolare:
●
●
●
●
DAY_OF_WEEK ritorna 1 per domenica, 2 per lunedì, 7 per sabato
MONTH ritorna 0 per gennaio, 1 per febbraio.. 11 per dicembre.
HOUR restituisce un numero tra 0 e 11
HOUR_OF_DAY restituisce un numero tra 0 e 23
Date in java
La classe SimpleDataFormat permette di
trasformare stringhe contenenti una data in
oggetti data e trasformare oggetti data in
stringhe…
SimpleDateFormat formato =
new SimpleDateFormat("HH:mm.ss E d MMM YYYY");
String ret = formato.format(new Date());
Sia la classe Date che la GregorianCalendar istanziano oggetti che
rappresentano la data corrente.
Creare un orologio analogico
Creaiamo un orologio analogico, partendo dalle
classi Quadrante (estensione di JPanel) e
Lancetta (estensione di JLabel)
Il quadrante conterrà tre lancette per ora, minuti
e secondi; ogni lancetta avrà un colore, uno
spessore, una lunghezza e un angolo di
rotazione.
Disegnare con Java
Per tutti gli oggetti che estendono la classe
Component (per es: JPanel e JLabel) è
possibile riscrive (override) il metodo paint che
viene chiamato in modo automatico quando, ad
esempio l’utente fa un resize.
E’ possibile “forzare” la chiamata a questo
metodo tramite il metodo repaint()
Il metodo paint riceve un oggetto Graphic che
dispone di vari metodi per “disegnare”
Classe Graphics
.clearRect(left, top, width,height)
.drawOval(left,top, width, height)
.drawLine(x1,y1, x2,y2)
.drawString(stringa, x, y)
Le coordinate crescono da sinistra verso destra
e dall’alto verso il basso.
Disegnamo il quadrante
con qualche conoscenza di trigonometria è
possibile disegnare un cerchio con 60 tacche
per i minuti..
Ogni minuto sarà
individuato da un angolo
90- 6* minuto (in gradi)
che si può trasformare in
radianti Math.toRadians(x)
Le lancette
Posizioniamo le tre lancette al centro (come se
fossero le ore 12:00).
Facendo poi ruotare rispetto al centro le tre
lancette di un angolo opportuno, in base all’ora
corrente.. otteniamo un orologio analogico!
Per ruotare un oggetto rispetto al suo punto
utilizzeremo le trasformazioni affini..
Trasformazioni Affini
Utiliziamo la Classe Graphics2D che estende la
classe Graphics
Graphics2D g2 = (Graphics2D) g;
Leggiamo gli attuali “valori” cioè tutto ciò che è
attualmente disegnato
AffineTransform t = g2.getTransform();
Shape forma = g2.getClip();
Trasformazioni Affini
ruotiamo ogni lancetta in base al punto in
basso a metà dell’angolo calcolato in base all’
ora
cx = this.getWidth()/2;
cy = this.getHeight();
t.rotate( Math.toRadians(angGradi), cx, cy);
Trasformazioni Affini
quindi applichiamo questa trasformazione
g2.setTransform(t);
g2.setClip(forma);
e facciamo riscrivere la lancetta
paintComponent(g);
paintBorder(g);
con le prime due istruzioni è un po come se “girassimo” il
foglio sul quale stiamo disegnando
e nel quadrante..
nel metodo paint del quadrante, dopo aver
disgnato il cechio e le tacche, è sufficiente
posizionare al centro le tre lancette, calcolare i
tre angoli e invocare il metodo
paintChildren(g);
che ridisegna i componenti contenuti nel
quadrante (le tre lancette)
orologio
non ci resta che creare un timer che ogni
secondo “forzi” il repaint del nostro quadrante.
java.util.Timer timerino = new java.util.Timer();
timerino.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
lblDigitale.setText(getStringaOra()
quadro.repaint();
}
}, 0, 1000);
);