FONDAMENTI DI INFORMATICA L-B - APPELLO DEL 17/09/2002

E' data la classe Luci che implementa un sistema di 10 luci intermittenti in grado di funzionare in due modalità: singola luce che scorre e luci alternate.  La classe comprende 3 metodi: changeMode()  (cambio modalità: luce che scorre/luci alternate)  tick() (fa avanzare le luci di un passo), lightOn(int index) (restituisce true se la luce in posizione index è accesa, false se è spenta).

public class Luci
{
  private int mode,counter;
  private boolean status[];

  public Luci()
  {
    int i;

    mode = 0;
    counter = 0;
    status=new boolean[10];
    for (i=0;i<10;i++)
      status[i]=(i==0);
  }

  public void changeMode()
  {
    mode = 1 - mode;
    tick();
  }

  public boolean lightOn(int index)
  {
    return status[index];
  }

  public void tick()
  {
    int i;

    switch (mode)
    {
      case 0:
        counter=(counter+1) % 10;
        for (i=0;i<10;i++)
          status[i]=(i==counter);
        break;
      case 1:
        counter=(counter+1) %2;
        for (i=0;i<10;i++)
          status[i]=(i % 2)==counter;
        break;
    }
  }
}

ESERCIZIO

Realizzare un'applicazione grafica (con Swing) che apre una finestra in cui sono contenuti:

Utilizzando un'istanza di Luci il comportamento della finestra è il seguente:

Alla fine di ogni risposta ad evento bisogna interrogare lo stato dell'oggetto di classe Luci mediante un serie di chiamate al metodo lightOn(...). Se lightOn(...) restituisce true il bottone corrispondente deve diventare rosso, altrimenti deve diventare grigio.

I valori da utilizzare per i colori sono Color.red e Color.lightGray

Importante: per lavorare con l'array di bottoni utilizzare dei cicli for. Una soluzione che non usa i cicli viene considerata come sbagliata.

La classe principale Swing1 è definita come segue:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Swing1
{
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("Esempio 1");
    Container c = frame.getContentPane();
    Swing1Panel p = new Swing1Panel();
    c.add(p);
    frame.setBounds(20,20,450,100);
    frame.show();
  }
}

La classe Swing1Panel è parzialmente definita come segue:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Swing1Panel extends JPanel implements ActionListener
{
  private Luci l;
  private JButton b1;
  private JButton luce[];
  private Timer t1;
  public Swing1Panel()
  {
   // Inserire qui di seguito le istruzioni di creazione e attivazione dei bottoni
   ...
   // Le istruzioni che seguono vanno lasciate in fondo al costruttore
   t1 = new Timer(500, this);
   t1.start();
  }
  public void actionPerformed(ActionEvent e)
  {
   ...
  }
}

Si chiede di scrivere l'implementazione del costruttore di Swing1Panel e del metodo actionPerformed che fornisce la risposta all'evento di pressione del bottone e di scatto del timer.