Matrix per la 4E

Realizzare una classe JChar, sottoclasse di JComponent, dotata di un attributo c di tipo char. Quando l’oggetto viene inserito all’interno di una finestra grafica, deve visualizzare il carattere memorizzato in c.
JChar deve implementare l’interfccia Runnable, che la faccia scendere a velocità costante verso il basso a partire dalla posizione iniziale. Facoltativo: durante la discesa il carattere deve modificarsi seguendo l’ordine dei codici Unicode (f-g-h-i-j-k-…)
JSpace, sottoclasse di JPanel, con layout assoluto, deve implementare un Thread che inserisce ad intervalli regolari in un punto scelto a caso un oggetto JChar con un carattere casuale. Appena inserito l’oggetto JChar deve iniziare a scendere fino a quando esce dallo schermo; a questo punto deve essere eliminato dal pannello.
Dovrebbero comparire una motitudine di caratteri in caduta come nel film Matrix (vedi figura).

Progetto Eclipse: 1) Matrix (Botta).zip ; 2) Matrix (PellegrinoE).zip
NB × PellegrinoE: il componente visuale JChar quando veniva inserito nel frame assumeva il nome char che è una parola riservata di Java; ho rinominato in JCharacter.

Progetto Eclipse: Molla.zip

Autostrada (programma per la 4E per il 10 aprile 2017

Realizzare la classe JCar in grado di visualizzare a scelta una delle 6 automobili precedenti. Ogni auto deve avere la possibilità di muoversi da destra a sinistra autonomamente con una velocità impostabile dal programmatore in fase di design. Le auto devono percorrere la strada in figura comparendo da sinistra fuori schermo, scomparendo a destra e riapparendo da sinistra.

Progetto realizzato in classe: MelaDiNewton.zip

Gas perfetto per la 4E e compito per venerdì 31 marzo 2017

Progetto Eclipse: GasPerfetto.zip

Per casa: realizzare un progetto che simuli il lancio di un proiettile in un campo gravitazionale. Deve essere presente a sinistra un pannello in cui poter scegliere le coordinate iniziali x0, y0, la velocità iniziale v0 e l’angolo di lancio. Premendo il testo Vai deve partire la simulazione e terminare automaticamente quando il proiettile tocca terra. È richiesto l’utilizzo del doppio buffering per evitare lo sfarfallio nell’animazione come visto a scuola nell’esempio GasPerfetto.

Effetti della non sincronizzazione nei Thread

Realizzare una classe ContoCorrente e due sottoclassi di Thread: BancomatA e BancomatB, che accedono allo stesso conto corrente. Simulare la situazione seguente: A e B prelevano quasi contemporaneamente dallo stesso conto corrente e non essendoci la sincronizzazione attivata riescono a prelevare una cifra superiore a quella disponibile sul conto.

Senza la sincronizzazione
Richiesto un prelievo da € 800.0
Richiesto un prelievo da € 750.0
Prelevato l’importo di € 750.0
Prelevato l’importo di € 800.0
Il saldo corrente è ora di € 200.0
Il saldo corrente è ora di € -550.0

Con la sincronizzazione
Richiesto un prelievo da € 800.0
Prelevato l’importo di € 800.0
Il saldo corrente è ora di € 200.0
Richiesto un prelievo da € 750.0
Non è possibile prelevare: il saldo è di € 200.0

Progetto Eclipse: ContoCorrente.zip

Scritta scorrevole (esempio sull’utilizzo di synchronized)

ScrittaScorrevole.java

public class ScrittaScorrevole {

	public static void main(String[] args) {
		new NegozioChiuso("21 agosto 2017").start();
		new NegozioAperto("22 agosto 2017").start();
	}
}

NegozioAperto.java

public class NegozioAperto extends Thread {

	private String data;

	public NegozioAperto(String data) {
		this.data = data;
	}

	@Override
	public void run() {
		Messaggio.scrive("Il negozio aprirà il " + data);
	}
}

NegozioChiuso.java

public class NegozioChiuso extends Thread {

	private String data;

	public NegozioChiuso(String data) {
		this.data = data;
	}

	@Override
	public void run() {
		Messaggio.scrive("Il negozio resterà chiuso fino al " + data);
	}
}

Messaggio.java

public class Messaggio {
	
	public static synchronized void scrive(String s) {
		for (int i=0; i<s.length(); i++) {
			System.out.print(s.charAt(i));
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
			}
		}
		System.out.println();
	}
}

Space Invaders


Ritagliare e ridimensionare le 3 immagini dei mostricciattoli del gioco Space Invaders e creare 3 sottoclassi di JLabel con nomi JAlien1, …2, …3. Collocare i vari alieni su varie file all’interno di una sottoclasse di JPanel chiamato JSpace con sfondo nero. Ogni alieno deve avere un movimento autonomo: 1 – deve scendere zigzagando a caso verso destra e verso sinistra, 2 – deve muoversi verso il basso ad intervalli di tempo casuali compresi fra 1 e 10 secondi, 3 – deve spostarsi sempre verso il basso e a destra ad intervalli regolari.

ThreadExample

JWait

public class JWait extends JLabel implements Runnable {

	private final String MESSAGE = "Wait, please";
	private boolean running = false;

	public JWait() {
		this.setText(MESSAGE);
		this.setOpaque(true);
		this.setBackground(Color.YELLOW);
	}

	public void start() {
		if (!running) {
			running = true;
			Thread t = new Thread(this);
			t.setDaemon(true);
			t.start();
		}
	}

	public void stop() {
		running = false;
	}

	public void reset() {
		this.setText(MESSAGE);
	}

	@Override
	public void run() {
		while (running) {
			this.setText(this.getText() + ".");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}

}

Progetto Eclipse: ThreadExample.zip

Per la spiegazione teorica sui thread fare riferimento al testo: Java per Robot, pag. 121
oppure alla pagina: http://www.claudiodesio.com/java/tutorialjavathread/threads.htm