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