LIA - DEIS - Facoltà di Ingegneria - Università di Bologna
Fondamenti di Informatica A - II° Modulo
Corso di laurea in Ing. Informatica (A-E) ed Elettrica - A. A. 2000-2001

Esercizio di Grafica


Dato il seguente codice:

public class Grafica {

public static void main(String args[]) {

C contA = new C(); C contB = new C();

JButton b = new JButton("Bottone 1");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Frame 1");
Container c = frame.getContentPane();
c.add(panel); panel.add(b);
frame.show();

}

}

class C {

protected int contatore;
public C() { contatore=0; }
public void inc() { contatore++; }

}

Si aggiunga il codice necessario affinché le pressioni "pari" del bottone (la seconda, la quarta, la sesta, ...) vadano ad incrementare il contatore dell'oggetto contA, mentre le pressioni "dispari" (la prima, la terza, la quinta, ...) vadano ad incrementare il contatore dell'oggetto contB.


Possibili soluzioni in due direzioni, con un solo o più (due) ascoltatori dell'evento associato al bottone:

 


Prima soluzione

Consideriamo come Listener la classe Contatore, e dobbiamo implementare qui la interfaccia ActionListener, e il metodo ActionPerformed.

public class Grafica {

public static void main(String args[]) {

C contA = new C(); contA. SetPari();
C contB = new C(); contB. SetDispari();

JButton b = new JButton("Bottone 1");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Frame 1");
Container c = frame.getContentPane();
c.add(panel);
panel.add(b);

b.addActionListener(contA);
b.addActionListener(contB);

frame.show();

}

}

class C implements ActionListener {

protected int contatore; int i=0;
int pariODispari;

public C() { contatore=0; }

public void inc() { contatore++; }
public void setPari () {pariODispari = 0;}
public void setDispari() {pariODispari = 1;}

public void actionPerformed(ActionEvent e)
{
i++;
if (i % 2 == pariODispari) contatore++;
}

// in alternativa le condizioni:

// if (i % 2 = 0 && ! pariODispari) contatore ++;
// if (i % 2 = 1 && pariODispari) contatore ++;

}

 

Si noti che le due istanze di classe C sono ciascuna registrata per la gestione del bottone:
per ogni pressione solo una delle due esecuzioni produce l'incremento.

Notate anche abbiamo distinto le due istanze in modo che contA sia una istanza che conta le pressioni pari (setPari) , contB sia una istanza che conta le pressioni dispari (setDispari).

Si ponga attenzione alla implementazione del metodo actionPerformed in cui distinguiamo se si deve implementare il contatore.
Si pensi alla possibilità di due sottoclassi di C, una per istanze pari, una per istanze dispari. c


Seconda soluzione

Consideriamo adesso come Listener una istanza della classe Esame1Panel: la soluzione è più ritagliata per le azioni che vogliamo svolgere.

Per ogni pressione il metodo di gestione decide quale contatore incrementare.

public class Grafica {

public static void main(String args[]) {

C contA = new C(); C contB = new C();

JButton b = new JButton("Bottone 1");

Esame1Panel panel = new Esame1Panel(contA, contB);


JFrame frame= new JFrame("Frame 1");
Container c = frame.getContentPane();
c.add(panel);
panel.add(b);

b.addActionListener(panel);
frame.show();

}

}

class Esame1Panel extends JPanel implements ActionListener {

C contA, contB; int i=0;

public Esame1Panel(C c1; C c2){

super();
this.contA = c1;
this.contB = c2;

}

public void actionPerformed(ActionEvent e){

i++; if (i %2 == 0) contA.inc(); else contB.inc();

}

}

class C {

protected int contatore;
public C() { contatore=0; }
public void inc() { contatore++; }

}