/** 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. Adapted by Andrew Walenstein for CMPT 318 class @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.awt.event.*; import java.util.*; public class ThermometerMVC318 extends java.applet.Applet { public void init() { // Model, View and Controller communicate through events: // 1. Controller->Model ==> java.awt.Event through Listeners // set up in Controller constructor // // 2. Model->View ==> java.lang.Observer // set up here after Model and View are constructed // final TempModel tempModel = new TempModel(); final TempView tempView = new TempView(); final TempController tempController = new TempController ( tempModel ); tempModel.addObserver ( tempView ); // Decorate { setForeground ( Color.black ); // Static panel to display model info // final TextArea ta = new TextArea ( tempModel.toString(), 5, 40 ); ta.setEditable ( false ); final Panel infoPanel = new Panel(); infoPanel.setLayout ( new GridLayout(2,1) ); infoPanel.add ( new Label("Model") ); infoPanel.add ( ta ); setLayout ( new GridLayout(4,1) ); add ( new Label("ThermometerMVC318: Illustrating the Model-View-Controller in Java")); add ( infoPanel ); } add ( tempView.getPanel() ); add ( tempController.getPanel() ); } } class TempModel extends Observable { public static int MAX_TEMP_F = 250; public static int MIN_TEMP_F = 0; private int fahrenheit; private int celcius; public TempModel() { this(0); } public TempModel ( final int temp ) { setTemperature ( temp ); } final public void setTemperature ( int newTempF ) { if ( newTempF > MAX_TEMP_F ) { newTempF = MAX_TEMP_F; } else if ( newTempF < MIN_TEMP_F ) { newTempF = MIN_TEMP_F; } this.fahrenheit = newTempF; this.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 "TempModel: 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 TempView implements Observer { private final Label myLabel; private final Panel viewPanel; public TempView() { myLabel = new Label ( "View" ); myLabel.setText ( "Current temperature: " ); myLabel.setForeground ( Color.red ); viewPanel = new Panel(); viewPanel.setLayout ( new GridLayout(2,1) ); viewPanel.add ( new Label ( "View" ) ); viewPanel.add ( myLabel ); } public Panel getPanel() { return viewPanel; } public void update ( Observable ob, Object arg ) { TempModel temp = (TempModel) ob; myLabel.setText ( "Temperature: "+temp.F()+"F, "+ temp.C()+"C, "+temp.K()+"K"); } } class TempController { final private Button myButton; final private Panel myPanel; public Panel getPanel() { return myPanel; } private TempModel tempModel; public TempController ( TempModel toObserve ) { this.tempModel = toObserve; myButton = new Button(); myButton.setForeground ( Color.blue ); myButton.setLabel ( "Switch temperature (0-"+tempModel.MAX_TEMP_F+"F)" ); myPanel = new Panel(); myPanel.setLayout ( new GridLayout(2,1) ); myPanel.add ( new Label("Controller") ); myPanel.add ( myButton ); myButton.addActionListener ( new ActionListener() { public void actionPerformed (ActionEvent e) { tempModel.setTemperature ((int)(Math.random()*tempModel.MAX_TEMP_F) ); } } ); } }