Lab 2010 #07
In laboratorio, lunedì, abbiamo visto come iniziare a progettare la costruzione di un orologio analogico (con lancette per le ore, i minuti e i secondi), gestito da un timer.
Inizialmente il codice era abbastanza scarno, si poteva creare una specie di cronometro e farlo partire mediante un pulsante.
Per farvi esercitare (e per approfondire qualcosa di grafica) ho pensato di aggiornarlo con alcune cose interessanti, come la colorazione delle lancette, la modifica dello spessore delle linee, l’inserimento di vari strumenti di controllo delle forme e degli spessori.
Adesso l’orologio controlla l’ora di sistema.
Per una questione didattica ho lasciato il pulsante di start/stop del timer che gestisce l’aggiornamento dell’orologio, così da mostrare come si possono gestire gli eventi del timer e come controllare che sia in esecuzione.
Inoltre ho aggiunto un pulsante per lo switch dell’orologio da analogico e digitale (ovvero la visualizzazione numerica dell’ora).
Ovviamente è tutto a disposizione di chi volesse ampliarne le funzionalità, magari aggiungendo un controllo per la data, etc..
Codice: Lab_20100412.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | import javax.swing.*; import java.awt.*; import java.awt.geom.*; import java.util.*; import javax.swing.Timer; import java.awt.event.*; import java.awt.GradientPaint; public class Lab_20100412 extends JPanel { public static void main(String[] argv) { new Lab_20100412(); } //ATTRIBUTI public GregorianCalendar gc = null; int h = 0; //ore int m = 0; //minuti int s = 0; //secondi double sanalog = 0; //secondi orologio analogico Timer t = null; JButton startstop = null; JButton analogicodigitale = null; boolean digitale = false; //boolean active = false; //COSTRUTTORE public Lab_20100412() { startstop = new JButton("stop"); analogicodigitale = new JButton("digitale"); setPreferredSize( new Dimension(600, 600) ); JFrame f = new JFrame("Orologio"); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(this, BorderLayout.CENTER); //inserimento quadrante orologio f.getContentPane().add(startstop, BorderLayout.SOUTH); //Inserimento bottone in basso nel frame f.getContentPane().add(analogicodigitale, BorderLayout.NORTH); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); t = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { gc = new GregorianCalendar(); sanalog = gc.get(Calendar.SECOND) + (gc.get(Calendar.MINUTE)*60) + (gc.get(Calendar.HOUR)*60*60); s = gc.get(Calendar.SECOND); m = gc.get(Calendar.MINUTE); h = gc.get(Calendar.HOUR); repaint(); } }); t.start(); startstop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!t.isRunning()) { t.start(); startstop.setLabel("stop"); } else { t.stop(); startstop.setLabel("start"); } repaint(); } }); analogicodigitale.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { digitale = !digitale; repaint(); } }); } public void paint(Graphics _g) { Graphics2D g = (Graphics2D)_g; paintComponent(g); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); if (!digitale) { int span = 50; int rqx = getWidth()/2; int rqy = getHeight()/2; Ellipse2D quadrante = new Ellipse2D.Double(span, span, rqx*2-span*2, rqy*2-span*2); GradientPaint gp = new GradientPaint(new Point(0, span), Color.GRAY, new Point(0, rqy*2-span*2), Color.WHITE); g.setPaint(gp); g.fill(quadrante); for (int i=0; i<12*5; i++) { int length = 30; if (i%5==0) { length = 50; g.setStroke(new BasicStroke(3)); g.setColor(Color.RED); } else { length = 30; g.setStroke(new BasicStroke(1)); g.setColor(Color.BLACK); } double angle = (2*Math.PI/(12*5))*i; double scr = Math.PI/2; Line2D tick = new Line2D.Double( (rqx-span-length)*Math.cos(angle-scr)+getWidth()/2, (rqy-span-length)*Math.sin(angle-scr)+getHeight()/2, (rqx-span)*Math.cos(angle-scr)+getWidth()/2, (rqy-span)*Math.sin(angle-scr)+getHeight()/2); g.draw(tick); } g.setColor(Color.BLACK); g.setStroke(new BasicStroke(3)); g.draw(quadrante); int cx = getWidth()/2; int cy = getHeight()/2; double rads = 2*Math.PI/60*sanalog; double radm = 2*Math.PI/(60*60)*sanalog; double radh = 2*Math.PI/(60*60*12)*sanalog; double scr = Math.PI/2; Line2D secondi = new Line2D.Double(cx, cy, cx+Math.cos(rads-scr)*(rqx-span-20), cy+Math.sin(rads-scr)*(rqy-span-20)); Line2D minuti = new Line2D.Double(cx, cy, cx+Math.cos(radm-scr)*(rqx-span-40), cy+Math.sin(radm-scr)*(rqy-span-40)); Line2D ore = new Line2D.Double(cx, cy, cx+Math.cos(radh-scr)*(rqx-span-60), cy+Math.sin(radh-scr)*(rqy-span-60)); g.setColor(Color.GREEN); g.setStroke(new BasicStroke(7, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.draw(ore); g.setColor(Color.BLUE); g.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.draw(minuti); g.setColor(Color.RED); g.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.draw(secondi); g.setColor(Color.YELLOW); g.fill( new Ellipse2D.Double(getWidth()/2-20, getHeight()/2-20, 40, 40) ); } else { g.setColor(Color.RED); g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 120)); g.drawString(""+h+":"+m, 50, 150); g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 70)); g.drawString(":"+s, 400, 150); } } } |
