FONDAMENTI DI INFORMATICA L-B - APPELLO DEL 17/04/2003

E' data la classe Stereo che implementa un impianto sterefonico

public class Stereo 
{

  private boolean is_on;
  public int volume;

  public Stereo()
  {
    is_on = false;
    volume = 5;
  }

  public void on()
  {
    is_on = true;
  }

  public void off()
  {
    is_on = false;
  }

  public boolean isOn()
  {
    return is_on;
  }

  public void incVol()
  {
    if (volume<9)
      volume++;
  }

  public void decVol()
  {
    if (volume>0)
      volume--;
  }

  public int getVol()
  {
    return volume;
  }

  public int getLeft()
  {
    if (is_on)
      return (int)Math.round(Math.random()*volume);
    else return 0;
  }

  public int getRight()
  {
    if (is_on)
      return (int)Math.round(Math.random()*volume);
    else return 0;
  }

  public String getDisplay()
  {
    if (is_on)
      return "ON - VOL: "+volume;
    else return "OFF";
  }
}

ESERCIZIO

L'esercizio consiste nella realizzazione di  un'applicazione grafica (con Swing) che simula un impianto stereofonico.

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,420,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 Stereo s;
  private Timer t1;
  private JTextField display;
  private JButton sx[], dx[];
  private JButton on, off, piu, meno;

  public Swing1Panel()
  {
    ...
    t1 = new Timer(500, this);
    t1.start();
  }

  public void actionPerformed(ActionEvent e)
  {

    ...    
  }

  public void showLights(int val, JButton l[])
  {
    ...
  }
}

Parte 1  - Creazione del pannello

Scrivere l'implementazione del costruttore di Swing1Panel in modo da creare una finestra come quella riportata qui di seguito

La finestra contiene:

Attenzione

E' obbligatorio utilizzare le variabili riportate nell'implementazione della classe Swing1Panel e cioè

private Stereo s;
private Timer t1;
private JTextField display;
private JButton sx[], dx[];
private JButton on, off, piu, meno;

Attenzione: 

Parte 2 - Gestione evento

Scrivere l'implementazione del metodo actionPerformed che fornisce la risposta all'evento di pressione dei vari bottoni e all'evento del timer in modo da realizzare la logica di funzionamento descritta qui di seguito:

Utilizzando un'istanza di Stereo il comportamento della finestra è il seguente (tra parentesi vengono suggeriti i metodi della classe Stereo da utilizzare per ogni operazione):

Ad ogni pressione di bottone il display mostra lo stato dello stereo utilizzando il metodo getDisplay() della classe Stereo

Quando arriva un evento del timer bisogna leggere il valore del livello audio dei due canali (con getLeft() e getRight()) e "accendere" i LED relativi invocando due volte (una per il canale sinistro e una per quello destro) il metodo showLights().

Parte 3 - Gestione accensione LED

Scrivere l'implementazione del metodo showLights() che gestisce la logica di "accensione" di un array di bottoni secondo regole riportate qui di seguito.

Attenzione: la gestione dei bottoni luminosi deve essere realizzata utilizzando dei cicli for, sono considerate scorrette le soluzioni che gestiscono i bottoni senza l'utilizzo di cicli