Lab 2010 #07

April 13, 2010

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

Tags: , ,

Leave a Reply

Your email address will not be published. Required fields are marked *

*

*


Contents license

Creative Commons License
Questo/a opera è pubblicato sotto una Licenza Creative Commons.