/** Program: ThermometerMVC1 applet Purpose: To illustrate the model-view-controller paradigm in Java. @author Steve A. Chervitz (sac@genome.stanford.edu) Adapted from David Geary's example in Java Report 2(1):31-37. @version 3 Mar 1997 This example encapsulates a minimal model, view and a controller to illustrate and experiment with the basics. */ import java.awt.*; import java.util.*; public class ThermometerMVC1 extends java.applet.Applet { private TemperatureView tempView; private TemperatureController1 tempController; public void init() { final TemperatureView tempView = new TemperatureView(); final TemperatureController tempController = new TemperatureController(); setFont(new Font("Helvetica",Font.BOLD, 16)); setForeground(Color.black); add( new Label("ThermometerMVC1: Illustrating the Model-View-Controller in Java")); Panel p_model = new Panel(); p_model.setLayout( new BorderLayout()); p_model.add("North", new Label("Model")); TextArea ta = new TextArea(tempController.getModel().toString(),5,40); ta.setFont( new Font("Helvetica",Font.PLAIN, 14)); ta.setEditable( false); p_model.add("Center",ta); Panel p_view = new Panel(); p_view.setLayout( new BorderLayout()); p_view.add("North", new Label("View")); p_view.add("Center",tempView); Panel p_controller = new Panel(); p_controller.setLayout( new BorderLayout()); p_controller.add("North", new Label("Controller")); p_controller.add("Center",tempController); add( p_model); add( p_view); add( p_controller); tempController.addObserver(tempView); } } class TemperatureModel extends Observable { public static int MAX_TEMP_F=250, MIN_TEMP_F=0; private int fahrenheit, celcius; public TemperatureModel() { this(0); } public TemperatureModel(int temp) { setTemperature(temp); } public void setTemperature(int f) { // System.out.println("TemperatureModel.setTemperature("+f+")"); if(f > MAX_TEMP_F) f = MAX_TEMP_F; else if(f < MIN_TEMP_F) f = MIN_TEMP_F; fahrenheit = f; celcius = (int) ((double)(fahrenheit-32)*5/9); setChanged(); notifyObservers(); } public int F() { return fahrenheit; } public int C() { return celcius; } public int K() { return celcius+273; } public String toString() { return "TemperatureModel: provides current temp\n"+ "in fahrenheit, celcius, or Kelvin.\n"+ "Max temp = "+MAX_TEMP_F+"F; Min temp ="+MIN_TEMP_F+"F\n"+ "setTemperature(int) expects fahrenheit.\n"; } } /*-----------------------------------------------------*/ class TemperatureView extends Label implements Observer /*-----------------------------------------------------*/ { private Dimension preferredSize = new Dimension(350,20); public TemperatureView() { setText("Current temperature: "); setForeground(Color.red); } public Dimension preferredSize(){ return preferredSize; } public void update(Observable ob, Object arg) { TemperatureModel temp = (TemperatureModel)ob; setText("Current temperature: "+temp.F()+"F, "+ temp.C()+"C, "+temp.K()+"K"); } } /*------------------------------------------*/ class TemperatureController1 extends Button /*------------------------------------------*/ { private Dimension preferredSize = new Dimension(350,40); private TemperatureModel tempModel; private int maxTempF = TemperatureModel.MAX_TEMP_F; public TemperatureController1() { setForeground(Color.blue); setLabel("Switch temperature (0-"+maxTempF+"F)"); tempModel = new TemperatureModel(); } public Dimension preferredSize(){ return preferredSize; } public boolean action(Event evt, Object arg) { tempModel.setTemperature((int)(Math.random()*maxTempF)); return true; } public void addObserver(Observer obs) { tempModel.addObserver(obs); //Initialize the view. obs.update(tempModel,this); } public TemperatureModel getModel() { return tempModel; } }