Lezione 4 - La programmazione guidata dagli eventi di AWT


Tutte le applicazioni in questa lezione sono state prese dai materiali del seminario tenuto al Cern da Raúl Ramos-Pollán.Allo stesso indirizzo al Cern e' disponibile una copia zippata dello stesso materiale, mentre la S accanto al titolo di ogni applicazione punta a una copia locale dello stesso materiale.



Applicazione 1:Create la seguente interfaccia usando gli oggetti grafici di Awt.S

AWT e' la libreria di base di java con gli oggetti che servono per la costruzione di interfacce grafiche. In essa trovate innazitutto oggetti grafici pronti per essere usati come Button, TextField, ScrollBar,etc
Trovate inoltre degli oggetti contenitore che possono contenere uno o piu' degli oggetti precedenti: Panel, Frame,etc
Un oggetto che serve a posizionare gli oggetti grafici nel contenitore: LayoutManager .


Applicazione 2:Posizionate gli oggetti grafici del precedente programma usando il GridLayout.S




Applicazione 3:Posizionate dei tasti usando il BorderLayout.S




Applicazione 4:Posizionate un Contenitore Panel in un BorderLayout e quindi altri oggetti nel Panel usando un GridLayout.S




Applicazione 5:Provate a usare altri oggetti grafici come Choice,Label,Textfield,textArea.S

I metodi da usare per i vari oggetti variano da oggetto a oggetto e vanno cercati come al solito nella documentazione standard del package AWT.

Passiamo ora agli eventi che permettono alla nostra interfaccia di diventare interattiva collegando ad esempio al click di un tasto l'esecuzione di un metodo.
Infatti una volta creato il vostro quadro di comando avete bisogno di specificare cosa succede quando schiacciate un bottone,muovete un cursore,etc
In effetti a ogni possibile intervento dell'utente e' associato un evento con un nome particolare generato dall'oggetto grafico corrispondente. Perche' quando si schiaccia un bottone succeda qualche cosa dobbiamo:

La programmazione di interfacce grafiche consiste nell'indicare per ogni possibile evento , la risposta del sistema e percio' viene detta event driven , guidata dagli eventi.


Applicazione 6:Quando viene schiacciato un tasto il programma scrive qualcosa.S
In questo caso l'evento si chiama Action e richiede la registrazione presso l'ActionListener e la scrittura del metodo actionPerformed dell'interfaccia ActionListener.


Applicazione 7:Quando viene selezionata un elemento da una lista il programma scrive qualcosa.S
In questo caso l'evento si chiama Item e richiede la registrazione presso l'ItemListener e la scrittura del metodo itemStateChanged dell'interfaccia ItemListener.


Applicazione 8:Come il precedente ma ora vogliamo sapere con esattezza quale item e' stato selezionato usando metodi e proprieta' dell'oggetto evento passato al metodo di trattamento dello stesso.S


Applet 9:Aggiungere al trattamento dell'azione di cliccare su un tasto (evento Action) anche il trattamento dell'azione del mouse che viene trascinato(evento MouseDragged) in un'applet che permette di fare disegni col mouse e poi di ripulire la finestra schiacciando un tasto.
import java.awt.*;
import java.applet.*;
import java.awt.event.*;


public class Disegna extends Applet  implements MouseMotionListener,ActionListener{

     int x, y;
     int rosso, verde,blu;
     Button tasto;
     boolean pulisci = false;

public void init() {
     x = 10;
    y = 100; 
     addMouseMotionListener(this);
     rosso = 0; verde=0; blu=0;
     add(tasto = new Button("Pulisci"));
     tasto.addActionListener(this);
}

public void mouseMoved(MouseEvent e){
 x = e.getX();
 y = e.getY();
 rosso =(int)( Math.random()*256);
verde =(int)( Math.random()*256);
blu =(int)( Math.random()*256);

 repaint();
 }

public void mouseDragged(MouseEvent e){}

public void actionPerformed(ActionEvent e){
        pulisci = true;
        repaint();
        }

public void update(Graphics g){
 paint(g);
}
public void paint( Graphics g) {
//System.out.println("rosso,verde,blu= " +rosso+" "+verde+" "+blu);  
if(pulisci){
  g.setColor(Color.white);
  g.fillRect(0,0,getSize().width,getSize().height);
    pulisci=false;
     }else{
   g.setColor(new Color(rosso,verde,blu));
  g.fillRect(x,y,10,10);
    }
}
}
Guardate l'applet in funzione.
I due eventi vengono detti uno di tipo semantico (Action) l'altro primitivo (MouseDragged) e sono trattati allo stesso modo ma da metodi diversi.


Applicazione 10:Usiamo i cosiddetti Adapter che permettono di ridefinire il solo metodo che interessa nel caso di eventi come il Mouse che hanno piu' metodi associati.S


Applicazione 11:Creazione di una classe di tasti specializzati.S


Applet 12:Trasformare l'applicazione 1 in applet.
import java.awt.*;
 
public class MyApplication {
 
  public static void main (String[] args) {
     Frame f = new Frame();
     f.setLayout (new FlowLayout());
     f.setLocation(100,100);
 
     f.add (new Button("This is button 1"));
     f.add (new Button("This is button 2"));
     f.add (new TextField("This is a textfield"));
     f.pack();
     f.show();
 }
}
diventa
import java.awt.*;
import java.applet.*;
public class Daframe1 extends Applet {

 public void init(){
  setLayout (new FlowLayout()); 
  add (new Button("This is button 1"));
  add (new Button("This is button 2"));
  add (new TextField("This is a textfield"));  
  }
 }
Guardate l'applet in funzione.


Applet 13:Trasformare l'applicazione 6 in applet.
import java.awt.*;
import java.awt.event.*;
 
public class MyApplication {
 
  public static void main (String[] args) {
 
     Button b = new Button ("Press me");
     MyActionListener alistener = new MyActionListener();
     b.addActionListener(alistener);
 
     Frame f = new Frame("Some sample");
     f.setLayout(new FlowLayout());
     f.setLocation(100,100);
     f.add (b);
 
     f.pack();
     f.show();
 }
}
 
public class MyActionListener implements ActionListener {
 
   public void actionPerformed(ActionEvent e) {
     System.out.println("A button has been pressed");
   }
}
diventa
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Daframe2 extends Applet {

 public void init(){
     Button b = new Button ("Press me");
     MyActionListener alistener = new MyActionListener();
     b.addActionListener(alistener);
 
     setLayout(new FlowLayout());
     add (b);
  }
}
public class MyActionListener implements ActionListener {
 
   public void actionPerformed(ActionEvent e) {
     System.out.println("A button has been pressed");
   }
}
Guardate l'applet in funzione.


Applet 14:Modificate l'applet precedente in modo da posizionare in maniera assoluta il tasto.
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Daframe3 extends Applet {

 public void init(){
     Button b = new Button ("Press me");
     MyActionListener alistener = new MyActionListener();
     b.addActionListener(alistener);
 
     setLayout(null);
     add (b);
     b.reshape(0,0,100,100);
  }
}
}
Guardate l'applet in funzione.


Applet 15:Modificate l'applet 13 in modo da gestire l'evento Action con una classe anonima(o classe interna,inner class).
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Daframe4 extends Applet {

 public void init(){
     Button b = new Button ("Press me");
     b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
           System.out.println("A button has been pressed");
        }
        });
 
     setLayout(new FlowLayout());
     add (b);
  }
}
Guardate l'applet in funzione.


Applet 16:Trasformate l'applicazione 2 in un applet ma questa volta lasciando intatto il frame originale .
import java.awt.*;

public class MyApplication {

  public static void main (String[] args) {
     Frame f = new Frame();
     f.setLayout (new GridLayout(2,2, 20, 20));
     f.setLocation(100,100);

     f.add (new Button("This is button 1"), new Dimension(1,1));
     f.add (new Button("This is button 2"), new Dimension(2,1));
     f.add (new TextField("This is a textfield"), new Dimension(2,2));
     f.pack();
     f.show();
 }
}
diventa
import java.awt.*;
import java.applet.*;
public class Daframe5 extends Applet {

 public void init(){

     Frame f = new Frame();
     f.setLayout (new GridLayout(2,2, 20, 20));
     f.setLocation(100,100);

     f.add (new Button("This is button 1"), new Dimension(1,1));
     f.add (new Button("This is button 2"), new Dimension(2,1));
     f.add (new TextField("This is a textfield"), new Dimension(2,2));
     f.pack();
     f.show();
 }
}
Guardate l'applet in funzione.


Applet 17:L'applet 11 della lezione 2 genera dei disegni a caso basandosi sul valore di 2 costanti. Trasformate l'applet facendo fare il disegno in un Canvas e aggiungendo un tasto di Start e 2 finestre per impostare il valore delle costanti .

import  java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Pick1 extends Applet implements ActionListener{
 int maxcol = 158;
 Color col[]=new Color[maxcol];
 PickCanvas disegno;
 Button b1;
 Panel p1,p2;
 TextField c1val,c2val;
 Label l1,l2;
 double c1,c2;

public void init(){
   c1 = Math.random()-5.;
   c2 = Math.random()-5.;
   Julia1.setcol(col);
   disegno = new PickCanvas(this);
   p1 = new Panel(); 
   p1.add(l1 = new Label("c1"));
   p1.add(c1val=new TextField(5));
   c1val.setText(Double.toString(c1));    
   p1.add(l2 = new Label("c2"));
   p1.add(c2val=new TextField(5));
   c2val.setText(Double.toString(c2));    
   p2 = new Panel(); 
   p2.add(b1 = new Button("Disegna"));
   b1.addActionListener(this);
   setLayout(new BorderLayout());
   add("North",p1);  
   add("Center",disegno);
   add("South",p2);  
   disegno.repaint();
 
}
public void actionPerformed(ActionEvent e){
  c1 = Double.valueOf(c1val.getText()).doubleValue();
  if(c1<-5.)c1=-5.;
  if(c1 > -.4)c1=-4.;
  c2 = Double.valueOf(c2val.getText()).doubleValue();
  if(c2<-5.)c2=-5.;
  if(c2 > -.4)c2=-4.;
  disegno.repaint();

}
class PickCanvas extends Canvas{
  Pick1 appl;
PickCanvas(Pick1 appl1){
   super();
   appl=appl1;
   }
public void paint(Graphics g){
    int i,j,ncol;

    for(i=0;i< getSize().width;i++){
      for(j=0;j< getSize().height;j++){
              ncol = (int)(appl.c1*(Math.sin(-11.+appl.c2*i)+Math.sin(-12.+appl.c2*j)));
              ncol = Math.abs(ncol)%appl.maxcol+1;
              g.setColor(appl.col[ncol]);
              g.fillRect(i,j,1,1);
              }
       }
}
}
}
Guardate l'applet in funzione. L'oggetto Canvas ha anch'esso i metodi paint,update e repaint. Passando al costruttore l'indirizzo dell'applet abbiamo potuto usare la paint che prima era nell'applet con pochissime modifiche.

INDIETRO a Imparate Java in una settimana
INDIETRO a Seminario su Java
Maintained by Giuseppe Zito: Giuseppe.Zito@cern.ch
Ultimo aggiornamento: