Nel riscrivere il programma puoi usare gran parte del codice che gia hai scritto. Volendo applicare il pattern Observer, nel tuo caso Quad è l'Observable e Visiva l'Observer.
Codice PHP:
import java.awt.*;
import java.util.*;
import java.util.logging.*;
import javax.swing.*;
public class Main {
public static void main(String args[]) {
Visiva visiva = new Visiva();
Quad[] quads = new Quad[48];
//inizializzo i vari quad (Observable)
for(int i = 0; i < quads.length; i++ ){
Quad quad = new Quad(i);
quad.getObservableQuadState().addObserver(visiva);
quads[i] = quad;
}
//aggiungo i quad al JFrame (Observer)
visiva.addQuads(quads);
//faccio partire i timer per il cambiamento di stato
for(int i = 0; i < quads.length; i++ ){
quads[i].exec();
}
}
}
class ObservableQuadState extends Observable{
int quadID;
String state;
public ObservableQuadState(int quadID){
this.quadID = quadID;
}
public void setState(String state){
this.state = state;
this.setChanged();
}
@Override
public void setChanged(){
super.setChanged();
}
@Override
public void notifyObservers(){
super.notifyObservers(state);
}
public int getQuadID() {
return quadID;
}
}
class Quad extends JButton{
private static final long delay = 500;
ObservableQuadState observableQuadState;
public Quad(int id){
observableQuadState = new ObservableQuadState(id);
}
public ObservableQuadState getObservableQuadState() {
return observableQuadState;
}
public void exec(){
try {
Thread.sleep(delay);
observableQuadState.setState("green");
observableQuadState.notifyObservers();
Thread.sleep(delay);
observableQuadState.setState("orange");
observableQuadState.notifyObservers();
Thread.sleep(delay);
observableQuadState.setState("red");
observableQuadState.notifyObservers();
} catch (InterruptedException ex) {
Logger.getLogger(Quad.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
class Visiva extends JFrame implements Observer{
Quad[] quads;
public void update(Observable o, Object arg) {
ObservableQuadState observableQuadState = (ObservableQuadState)o;
String color = (String)arg;
System.out.println("Cambiamento di stato: Quad["+observableQuadState.getQuadID()+"], stato = " + color);
//modifico il colore del Quand che ha subito il cambiamento
....
}
public void addQuads(Quad[] quads){
this.quads = quads;
//aggiungo i quads al JFrame
....
}
}