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