JAVALAB#009 – Ripasso Grafica ed Eventi

Per la preparazione al test del 17 su:

  • Grafica
  • Animazione
  • Eventi

oggi in laboratorio abbiamo sviluppato un programma molto semplice. Quqesto programma consiste in un frame dallo sfondo nero. Se vi si clicca all’interno si creano delle palle gialle. Quando si fa click all’interno di una delle palle la si può spostare.
Molto semplce.

Ecco il codice:

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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
 
/*
 * Classe contenente il solo metodo MAIN
 * dal quale viene fatto partire il programma
 */
public class Lab03_20090414
{
	/*
	 * Il main contiene un oggetto di tipo JFrame contenente un'istanza
	 * della classe MouseEventPane come pannello principale
	 */
	public static void main(String[] argv)
	{
		JFrame f = new JFrame("Applicazione coi pippoli che se spostano");
		f.getContentPane().add(new MouseEventPane());
		f.setSize(500, 500);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}
 
/*
 * Classe che definisce il comportamento dell'ambiente di lavoro del programma.
 * Il pannello contiene degli ascoltatori per il mouse che provvedono alla gestione
 * di un array di oggetti di tipo "Palla".
 * Mediante gli ascoltatori questi oggetti interagiscono con il mouse
 */
class MouseEventPane extends JPanel
{
	//ArrayList di Palle
	private ArrayList pallette = null;
	//Variabile di controllo per la selezione della palla sulla quale si trova il mouse
	private int mclick = -1;
 
	//Costruttore
	public MouseEventPane()
	{
		super();
		//Richiamo del metodo che contiene gli ascoltatori del mouse
		eventHandler();
		//Nuova istanza dell'arraylist
		pallette = new ArrayList();
	}
 
	//Contenitore per gli ascoltatori di eventi del mouse
	public void eventHandler()
	{
		addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{				
				//Scorrimento dell'array di Palle
				for (int i=0; i<pallette.size(); i++)
				{
					//Controllo della presenza del mouse su una delle palle dell'arraylist
					if ( ((Palla)(pallette.get(i))).contains(e.getPoint()) )
					{
						//Assegnazione dell'indice dell'array alla variabile contatore
						mclick = i;
					}
				}
				//Se il mouse non è su nessuna delle palle presenti nell'arraylist si crea una nuova palla
				if (mclick == -1)
					pallette.add(new Palla(e.getPoint()));
			}
 
			public void mouseReleased(MouseEvent e)
			{
				//Quando viene rilasciato il mouse si imposta di default il valore del contatore
				mclick = -1;
			}
		});
 
		addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent e)
			{
				//Se il valore del contatore identifica un elemento dell'arraylist si provvede allo spostamento
				if (mclick != -1)
					((Palla)(pallette.get(mclick))).muovi(e.getPoint());
			}
 
			public void mouseMoved(MouseEvent e)
			{
				//Se il mouse è su un elemento dell'arraylist questo cambia colore
				for (int i=0; i<pallette.size(); i++)
				{
					if ( ((Palla)(pallette.get(i))).contains(e.getPoint()) )
						((Palla)(pallette.get(i))).setColor(Color.RED);
					else
						((Palla)(pallette.get(i))).setColor(Color.GREEN);
				}
			}
		});
 
		new javax.swing.Timer(50, new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				//for (int i=0; i<pallette.size(); i++)
				//	((Palla)(pallette.get(i))).update();
 
				//Repaint del pannello all'evento del timer (ogni 50 millisecondi)
				repaint();
			}
		}).start();
	}
 
	//Colorazione dello sfondo del pannello con un rettangolo nero
	public void paintComponent(Graphics g)
	{
		g.setColor(Color.BLACK);
		g.fillRect(0, 0, getWidth(), getHeight());
	}
 
	//Disegno delle ellissi nel pannello
	public void paint(Graphics _g)
	{
		Graphics2D g = (Graphics2D)_g;
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		paintComponent(g);
 
		//Scorrimento dell'arraylist per il disegno sul pannello di tutte le palle
		for (int i=0; i<pallette.size(); i++)
		{
			( (Palla)(pallette.get(i)) ).draw(g);
		}
	}
}
 
/*
 * La classe Palla definisce le caratteristiche di ogni singolo oggetto Palla creato.
 * Contiene informazioni su: Colore, Posizione e dimensioni.
 */
class Palla
{
	public static final int DIM = 100;
	private Ellipse2D palla = null;
	private Color colore = null;
	private Point p = null;
 
	/*
	 * Costruttore della classe Palla
	 * Gli si deve passare un oggetto di tipo Point per definire
	 * il punto di applicazione della Palla
	 */
	public Palla(Point p)
	{
		this.p = p;
		colore = Color.YELLOW;
		palla = new Ellipse2D.Double(p.x-DIM/2, p.y-DIM/2, DIM, DIM);
	}
 
	/*
	 * Metodo per lo spostamento della Palla
	 */
	public void muovi(Point p)
	{
		palla.setFrame(p.x-DIM/2, p.y-DIM/2, DIM, DIM);
	}
 
	/*
	 * Metodo per il disegno nel Graphics2D della palla
	 */
	public void draw(Graphics2D g)
	{
		g.setColor(colore);
		g.fill(palla);
	}
 
	/*
	 * Metodo "breve" per la generazine di numeri casuali di tipo "float"
	 */
	public float r()
	{
		return (float)(Math.random());
	}
 
	/*
	 * Selezione di un colore casuale da dare alla palla attuale
	 */
	public void update()
	{
		setColor(new Color(r(), r(), r()));
	}
 
	/*
	 * Selezione del colore da assegnare alla palla attuale
	 */
	public void setColor(Color colore)
	{
		this.colore = colore;
	}
 
	/*
	 * Metodo in grado di controllare se il puntatore si trova (o meno) all'interno della shape
	 * che identifica la palla disegnata nel pannello
	 */
	public boolean contains(Point p)
	{
		return palla.contains(p);
	}
}

About the Author

Hello everyone! I'm Andrea Rastelli, a 23 year old programmer, designer, 3D animator and compositor. You may follow me on Twitter and Facebook