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à.