JCanvas

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;

public class JCanvas extends JPanel implements MouseListener, MouseMotionListener {

	private int x1 = -1, y1 = -1, x2 = -1, y2 = -1;

	public JCanvas() {
		this.setPreferredSize(new Dimension(100, 100));
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.drawLine(x1, y1, x2, y2);
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1 = e.getX(); x2 = x1;
		y1 = e.getY(); y2 = y1;
		repaint();
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2 = e.getX();
		y2 = e.getY();
		repaint();
	}

	@Override
	public void mouseClicked(MouseEvent e) { }

	@Override
	public void mouseEntered(MouseEvent e) { }

	@Override
	public void mouseExited(MouseEvent e) { }

	@Override
	public void mouseMoved(MouseEvent e) { }
	
}

Esercizio per casa 4E Informatica

trasformazioni-di-coordinate

Migliorare il programma visto in classe inserendo le etichette dei numeri sugli assi cartesiani: -2 -1 0 1 2 3 4 etc. distanziate di 40 pixel; fare in modo che alla pressione del mouse vengano visualizzate le coordinate con il corretto fattore di scala coerente con le etichette inserite. Listato:

package it.liceocuneo.math;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;

import javax.swing.JPanel;

public class JOxy extends JPanel implements Serializable, MouseListener {

	private String titleX = "X", titleY = "Y";
	private boolean visibile = false;
	private int posX = 0, posY = 0;

	public JOxy() {
		this.setPreferredSize(new Dimension(200, 200));
		this.setBackground(Color.WHITE);
		this.addMouseListener(this);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);

		int w = this.getWidth(), h = this.getHeight();
		int w2 = w / 2, h2 = h / 2;

		g.setColor(Color.BLACK);
		g.drawLine(0, h2, w - 1, h2);
		g.drawLine(w2, 0, w2, h - 1);

		g.drawString(titleX, w - 10, h2 - 5);
		g.drawString(titleY, w2 + 5, 15);

		if (visibile) {
			int xReale = posX - w2;
			int yReale = h2 - posY;
			g.drawString("(" + xReale + "," + yReale + ")", posX + 10, posY + 5);
		}
	}

	public String getTitleX() {
		return titleX;
	}

	public void setTitleX(String titleX) {
		this.titleX = titleX;
	}

	public String getTitleY() {
		return titleY;
	}

	public void setTitleY(String titleY) {
		this.titleY = titleY;
	}

	@Override
	public void mouseClicked(MouseEvent arg0) { }

	@Override
	public void mouseEntered(MouseEvent arg0) { }

	@Override
	public void mouseExited(MouseEvent arg0) { }

	@Override
	public void mousePressed(MouseEvent arg0) {
		posX = arg0.getX();
		posY = arg0.getY();
		visibile = true;
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		visibile = false;
		repaint();
	}

}

Grafica in Java

Esempio visto in classe: Grafica.zip

Creare un componente grafico che si autodimensiona quando si ridimensiona la finestra che lo contiene e che rappresenta un rombo bianco con bordo nero all’interno di un’ellisse gialla con bordo nero. Devono essere visibili in fase di progettazione nel WindowBuilder gli attributi coloreRombo e coloreEllisse di tipo Color preimpostati sui valori suddetti.

Esercizi in preparazione alla verifica di Informatica

Creare un’applicazione per NXT che utilizzi il sensore ad ultrasuoni e il sound sensor. Il programma deve avviarsi e rimanere all’interno di un ciclo in cui viene letta la distanza con il sensore ad ultrasuoni montato frontalmente ad una frequenza di 4 letture al secondo. Quando la distanza scende al di sotto di 30 cm il robot deve ruotare a destra di 90° e ripartire se era in movimento. Il sound sensor deve essere utilizzato con un ascoltatore di eventi e deve servire a farlo partire/fermare mediante un battito di mani 50 dB (inserire anche qui un ritardo di almeno 0,5 secondi per impedire che il battito di mani venga rilevato molte volte facendo fermare/partire in successione con risultati imprevedibili). La pressione del tasto ESCAPE deve far terminare il programma.

Creare un’interfaccia grafica che contenga un pannello JPanel con associato un evento attivato dal movimento del mouse. Nel JPanel deve esserci un null layout e una JLabel di nome lblCoord, posizionata in alto a sinistra che inizialmente visualizza la stringa “(0,0)”. Quando il mouse si muove devono essere visualizzate nella label i valori delle coordinate del mouse e la label deve spostarsi e rimanere sempre vicino a destra del cursore.

package coordinate;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class JCoord extends JPanel implements MouseMotionListener {
	private JLabel lblCoord;

	public JCoord() {
		setBackground(Color.WHITE);
		setLayout(null);

		lblCoord = new JLabel("(0,0)");
		lblCoord.setBounds(0, 0, 100, 14);
		add(lblCoord);
		
		this.addMouseMotionListener(this);
	}

	@Override
	public void mouseDragged(MouseEvent me) {
	}

	@Override
	public void mouseMoved(MouseEvent me) {
		int x = me.getX();
		int y = me.getY();

		lblCoord.setText("(" + x + "," + y + ")");
		lblCoord.setLocation(x + 20, y);
	}
}

Gestore di evento condiviso da più bottoni

Creare un pannello, analogo a quello visto in classe che contenga:

  • sulla sinistra una label, che possa visualizzare una delle 3 possibili scritte “Angoli in °”, “Angoli in rad”, “Angoli in grad”;
  • più a destra 3 radio button con le scritte Deg, Rad, Grad, che permettano di modificare l’unità di misura degli angoli.

Deve esserci un solo gestore d’evento che riconosca mediante uno switch il radio button premuto; ricordarsi di inserire i 3 radio button in un radio group affinchè funzionino insieme.

Esempio visto in classe: Colori.zip

Eventi in Swing

Realizzare un’applicazione visuale che gestisca manualmente gli eventi del mouse: quando si clicca in un punto su di un pannello vuoto le coordinate vengono lette e inserite in una textarea, una dopo l’altra.

Progetto Eclipse: FinestraEventi.zip

Gestione di più eventi in parallelo

Modificare il programma realizzato in classe in modo che gestisca anche i 2 sensori restanti: il TouchSensor e l’UltrasonicSensor e visualizzi i valori sulle righe 2 e 3.

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.nxt.SoundSensor;

public class SensoriInsieme {

	LightSensor ls;
	SoundSensor ss;

	private class AscoltaLuce implements SensorPortListener {

		@Override
		public void stateChanged(SensorPort aSource, int aOldValue, int aNewValue) {
			int value = ls.readValue();
			LCD.drawString("LS=" + value + "   ", 0, 0);
		}

	}

	private class AscoltaSuono implements SensorPortListener {

		@Override
		public void stateChanged(SensorPort aSource, int aOldValue, int aNewValue) {
			int value = ss.readValue();
			LCD.drawString("SS=" + value + "   ", 0, 1);
		}

	}

	public SensoriInsieme() {
		ls = new LightSensor(SensorPort.S1);
		ss = new SoundSensor(SensorPort.S2);
		SensorPort.S1.addSensorPortListener(new AscoltaLuce());
		SensorPort.S2.addSensorPortListener(new AscoltaSuono());
	}

	public static void main(String[] args) {
		new SensoriInsieme();
		Button.ESCAPE.waitForPressAndRelease();
	}

}

Gestori di evento in NXT

Esercizio per casa: realizzare un programma che legga e visualizzi sulla prma riga il valore del sensore di luce mediante un ascoltatore di evento; rallentare l’esecuzione con una pausa di 1/2 secondo.

1º metodo

import lejos.nxt.Button;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.nxt.TouchSensor;

public class TouchSensorEvent {
	
	private TouchSensor ts;
	
	private class TouchSensorListener implements SensorPortListener {

		@Override
		public void stateChanged(SensorPort aSource, int aOldValue, int aNewValue) {
			System.out.println(aOldValue + " => " + aNewValue);	
		}
		
	}

	public TouchSensorEvent() {
		ts = new TouchSensor(SensorPort.S1);
		SensorPort.S1.addSensorPortListener(new TouchSensorListener());
	}
	
	public static void main(String[] args) {
		new TouchSensorEvent();
		Button.ESCAPE.waitForPressAndRelease();
	}

}

2º metodo

import lejos.nxt.Button;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.nxt.TouchSensor;

public class TouchSensorEvent2 implements SensorPortListener {

	private TouchSensor ts;

	@Override
	public void stateChanged(SensorPort aSource, int aOldValue, int aNewValue) {
			System.out.println(aOldValue + " => " + aNewValue);	
	}

	public TouchSensorEvent2() {
		ts = new TouchSensor(SensorPort.S1);
		SensorPort.S1.addSensorPortListener(this);
	}

	public static void main(String[] args) {
		new TouchSensorEvent2();
		Button.ESCAPE.waitForPressAndRelease();
	}

}

3º metodo

import lejos.nxt.Button;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.nxt.TouchSensor;

public class TouchSensorEvent3 {

	private TouchSensor ts;
	
	public TouchSensorEvent3() {
		ts = new TouchSensor(SensorPort.S1);
		SensorPort.S1.addSensorPortListener(new SensorPortListener() {

			@Override
			public void stateChanged(SensorPort aSource, int aOldValue, int aNewValue) {
			System.out.println(aOldValue + " => " + aNewValue);	
			}
			
		} );
	}
	
	public static void main(String[] args) {
		new TouchSensorEvent3();
		Button.ESCAPE.waitForPressAndRelease();
	}

}

Interfacce

Creare una classe astratta chiamata Punto contenente gli attributi double x, y, z e il metodo astratto sposta(x,y,z). Creare la sottoclasse PuntoMateriale avente in più l’attributo double massa e costruire il metodo sposta(x,y,z).

Creare l’interfaccia Fisica avente gli attributi C (velocità della luce), AU (unità astronomica), PC (parsec).

Creare un programma con il metodo main che utilizzi PuntoMateriale e lo sposti di alcune unità astronomiche mediante sposta(), utilizzando l’interfaccia Fisica.