CECCOLINI MATTEO 113514
ESERCITAZIONE 5
DESCRIZIONE DEL PROBLEMA:
1. Far comparire una finestra di dimensioni fisse al centro dello schermo. Nella finestra deve esserci un pannello
diviso in due parti: una centrale, con disegnata una crocetta di dieci pixel, e una inferiore con un pulsante
‘Quit’ per far terminare l’applicazione.
2. Aggiungere alla finestra del punto uno quattro pulsanti per gestire lo spostamento della crocetta, verso i quattro
punti cardinali. Nella zona nord del pannello posizionare un’area di testo dove inserire il numero di pixel a cui
si deve far riferimento lo spostamento.
3. Poter spostare la crocetta con il click del mouse, e poter disegnare delle linee dopo aver premuto un pulsante.
ANALISI:
1. La finestra deve essere centrata nello schermo e le dimensioni deve rimanere fisse, date dal costruttore del
software. Il pannello è diviso in due parti. Quella centrale deve contenere una crocetta di dieci pixel al centro
del pannello, e quella inferiore deve avere al proprio centro un pulsante per la chiusura della finestra.
2. La finestra rimane quella del punto uno con l’aggiunta di altri componenti. Nella zona nord un’area di testo
contenete il numero di pixel per lo spostamento, e una label che indica l’area di testo. Nella zona sud oltre al
pulsante quit vengono aggiunti altri quattro pulsanti (up, down, left, right), per lo spostamento della crocetta.
3. Anche qui la finestra rimane quella del punto precedente, bisogna aggiungere la possibilità di muovere la
crocetta al click del mouse e la proprietà di disegnare linee quando si preme un tasto.
PROGETTO:
In generale per tutti e tre i punti sono state importati i seguenti package:
import java.awt.*;
import javax.swing.*;
1.
2.
3.
MyFrame è una nuva finestra che viene ereditata da Jframe. Alla finestra viene dato un titolo, in questo caso
‘Esercitazione’, attraverso il costruttore. In questo caso utilizzeremo la parola chiave super() per richiamare il
costruttore della classe principale. Le dimensioni della finestra vengono settate dal metodo setBounds. Viene
poi installato un pannello diviso in due parti. Per dividere il pannello si serve del metodo setLayout(new
BorderLayout). I vari componenti grafici vengono posti nel pannello attraverso il metodo add(‘oggetto’). Per
far si che il pulsante quit riesca a far terminare l’applicazione si è dovuto implementare le interfaccie
WindowsListener e ActionListener che rendono il pannello un vero e proprio ‘ascoltatore’ delle azioni dei
pulsanti. Bisogna però anche utilizzare il metodo addActionListener(Component c) sull’ oggetto che deve fare
l’azione(in questo caso il pulsante). MyPanel1 invece ha al suo interno i metodi per disegnare la crocetta.
Questa classe si avvale dei metodi del PaintComponent.
Il pannello principale ora non è più diviso in due parti, ma in tre, perché nella zona nord inseriamo due nuovi
oggetti grafici: una label (JLabel) che indica l’area di testo (JtextField) contenente il numero di pixel per lo
spostamento della crocetta, e nella zona sud i quattro pulsanti (Jbutton) per lo spostamento della crocetta.
Abbiamo detto che la crocetta si sposta nelle quattro direzioni dei punti cardinali, difatti ogni qual volta che si
preme un pulsante-spostamento si richiamano due metodi: incX e incY che incrementano(o decrementano) le
coordinate della croce. Naturalmente per vedere la croce spostata bisogna richiamare un altro metodo:
repaint(), che ridisegna tutto il PaintComponent. Ricordo che il Jframe rimane quello del punto precedente.
Viene aggiunto un nuovo pulsante nella zona nord del pannello. Questo pulsante inizializzato con la scritta
‘Start’ consente una volta premuto di poter disegnare delle linee spostando la crocetta. Una volta premuto
cambia il proprio stato cancellando la scritta precedente e introducendo la scritta ‘Stop’. Una volta ripremuto
ricambia stato e non è più possibile disegnare linee. Per disegnare le linee mi sono avvalso della classe Vector
che mi consente di costruire array di capacità variabile. Io avevo pensato di introdurre una variabile booleana
che mi consentisse di poter, o meno, disegnare le linee, ma sfortunatamente quest’ ultimo punto non funziona.
IMPLEMENTAZIONE:
// * * * * PRIMO PUNTO * * * * //
L’implementazione del primo punto non è stata inserita perché è simile a quella del punto due senza però alcune parti
come l’implementazione dei quattro pulsanti e il loro utilizzo.
// * * * * SECONDO PUNTO * * * * //
//IMPLEMENTAZIONE DELLA FINESTRA
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
private Dimension d;
private int dim=500;
public MyFrame(){
super("Esercitazione");
d=new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
setBounds((int)(d.getWidth()/2-dim/2),(int)(d.getHeight()/2-dim/2),dim,dim);
}
}
//IMPLEMENTAZIONE DEI PANNELLI
//MY PANEL
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MyPanel extends JPanel implements WindowListener {
private JButton u,d,l,r,q;
private MyPanel1 p1;
private JTextField c;
private int i=1;
public MyPanel(){
super();
setLayout(new BorderLayout());
Panel p = new Panel();
JLabel s=new JLabel("INCREMENTO:");
c = new JTextField("1",5);
p.add(s);
p.add(c);
p1 = new MyPanel1();
MyPanel2 p2 = new MyPanel2();
c.addActionListener(p2);
add(p,BorderLayout.NORTH);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);
}
public void windowClosing(WindowEvent e) {System.exit(0);}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
private class MyPanel2 extends JPanel implements ActionListener{
public MyPanel2(){
super();
q=new JButton("Quit");
q.setMnemonic ('q');
u=new JButton("U");
u.setMnemonic ('u');
d=new JButton("D");
d.setMnemonic ('d');
l=new JButton("L");
l.setMnemonic ('l');
r=new JButton("R");
r.setMnemonic ('r');
q.addActionListener(this);
u.addActionListener(this);
d.addActionListener(this);
l.addActionListener(this);
r.addActionListener(this);
add(u);
add(d);
add(l);
add(r);
add(q);
}
public void actionPerformed(ActionEvent e){
Object pressed = e.getSource();
if(pressed==q)
System.exit(0);
if(pressed==u)
p1.incY(i);
if(pressed==d)
p1.incY(-i);
if(pressed==l)
p1.incX(i);
if(pressed==r)
p1.incX(-i);
if(pressed==c){
try{
i=Integer.valueOf(c.getText()).intValue();
}catch(NumberFormatException e1){
i=1;
c.setText("1");
}
}
p1.repaint();
}
}
}
//MY PANEL 1
import java.awt.*;
import javax.swing.*;
public class MyPanel1 extends JPanel{
private int w,h,x,y;
private int x1,y1,x2,y2;
public void paintComponent(Graphics g){
Dimension d=new Dimension(getSize());
super.paintComponent(g);
w=(int)(d.getWidth()/2);
h=(int)(d.getHeight()/2);
g.setColor(Color.black);
x1=w-x;
y1=h-y;
g.drawLine((x1-5),(y1),(x1+5),(y1));
g.drawLine((x1),(y1-5),(x1),(y1+5));
}
public void incX(int n){
x+=n;
if(x>w-5) x=w-5;
if(x<-w+5) x=-w+5;
}
public void incY(int n){
y+=n;
if(y>h-5) y=h-5;
if(y<-h+5) y=-h+5;
}
}
//ESERCIZIO
//* * * * TERZO PUNTO * * * * //
//IMPLEMENTAZIONE DELLA FINESTRA
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
private Dimension d;
private int dim=500;
public MyFrame(){
super("Esercitazione");
d=new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
setBounds((int)(d.getWidth()/2-dim/2),(int)(d.getHeight()/2-dim/2),dim,dim);
}
}
//IMPLEMENTAZIONE DEI PANNELLI
//MY PANEL
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MyPanel extends JPanel implements WindowListener {
private JButton u,d,l,r,q,st;
private MyPanel1 p1;
private JTextField c;
private int i=1;
private boolean en=true;
public MyPanel(){
super();
setLayout(new BorderLayout());
Panel p = new Panel();
JButton st = new JButton("START");
JLabel s = new JLabel("INCREMENTO:");
c = new JTextField("1",5);
p.add(st);
p.add(s);
p.add(c);
p1 = new MyPanel1();
MyPanel2 p2 = new MyPanel2();
c.addActionListener(p2);
st.addActionListener(p2);
add(p,BorderLayout.NORTH);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH);
}
public void windowClosing(WindowEvent e) {System.exit(0);}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
private class MyPanel2 extends JPanel implements ActionListener{
public MyPanel2(){
super();
q=new JButton("Quit");
q.setMnemonic ('q');
u=new JButton("U");
u.setMnemonic ('u');
d=new JButton("D");
d.setMnemonic ('d');
l=new JButton("L");
l.setMnemonic ('l');
r=new JButton("R");
r.setMnemonic ('r');
q.addActionListener(this);
u.addActionListener(this);
d.addActionListener(this);
l.addActionListener(this);
r.addActionListener(this);
add(u);
add(d);
add(l);
add(r);
add(q);
}
public void actionPerformed(ActionEvent e){
Object pressed = e.getSource();
if(pressed==q)
System.exit(0);
if(pressed==u)
p1.incY(i);
if(pressed==d)
p1.incY(-i);
if(pressed==l)
p1.incX(i);
if(pressed==r)
p1.incX(-i);
if(pressed==st){
if(en==false){
en=true;
st.setText("STOP");
p1.enable=true;
}else{
en=false;
st.setText("START");
p1.enable=false;
}
}
if(pressed==c){
try{
i=Integer.valueOf(c.getText()).intValue();
}catch(NumberFormatException e1){
i=1;
c.setText("1");
}
}
p1.repaint();
}
}
}
//MY PANEL 1
import java.awt*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class MyPanel1 extends JPanel implements MouseListener{
private int w,h;
private int x,y,x1,y1,x2,y2;
private Point now;
private int i;
private Point[] l = new Point[2];
private Vector line = new Vector(0,1);
public boolean enable = true;
public void paintComponent(Graphics g){
Dimension d=new Dimension(getSize());
addMouseListener(this);
super.paintComponent(g);
w=(int)(d.getWidth()/2);
h=(int)(d.getHeight()/2);
g.setColor(Color.black);
x1=w-x;
y1=h-y;
now = new Point(x1,y1);
g.drawLine((x1-5),(y1),(x1+5),(y1));
g.drawLine((x1),(y1-5),(x1),(y1+5));
if(line.capacity()!=0){
for(i=0; i<line.capacity(); i++){
CLinea l = (CLinea)line.elementAt(i);
Point a = l.start();
Point b = l.end();
int xp1=(int)a.getX();
int yp1=(int)a.getY();
int xp2=(int)b.getX();
int yp2=(int)b.getY();
g.drawLine(xp1,yp1,xp2,yp2);
}
}
}
public void mouseClicked(MouseEvent e){
Point p = e.getPoint();
x = (int)(w-p.getX());
y = (int)(h-p.getY());
controlX();
controlY();
if(enable==true)
line.add(new CLinea(now,p));
repaint();
}
public void mouseEntered(MouseEvent e){};
public void mouseExited(MouseEvent e){};
public void mousePressed(MouseEvent e){};
public void mouseReleased(MouseEvent e){};
public void incX(int n){
x+=n;
controlX();
}
public void incY(int n){
y+=n;
controlY();
}
public void controlX(){
if(x>w-5) x=w-5;
if(x<-w+5) x=-w+5;
}
public void controlY(){
if(y>h-5) y=h-5;
if(y<-h+5) y=-h+5;
}
public class CLinea{
private Point s,e;
public CLinea(Point a, Point b){
s=a;
e=b;
}
public Point start(){
return s;
}
public Point end(){
return e;
}
}
}
CASI D’USO:
//IMPLEMENTAZIONE DELL’ESERCIZIO (Componente software per l’utilizzo delle varie classi implementate)
import java.awt.*;
import javax.swing.*;
public class Esercizio {
public static void main(String[] v){
MyFrame f = new MyFrame();
Container c=f.getContentPane();
MyPanel p=new MyPanel();
c.add(p);
f.show();
}
}
OUTPUT PER IL SECONDO PUNTO:
OUTPUT PER IL TERZO PUNTO:
CONCETTI E TECNICHE ACQUISITE:
Gestione degli eventi e delle eccezioni; uso di vari componenti grafici come i pulsanti, le label etc; utilizzazione di una
nuova classe, Vector, in grado di poter creare vettori di oggetti con dimensione variabile; riuso dell’ereditarietà.