| BMIMVCComposer.java |
package lectures.mvc.toolkit;
import util.annotations.WebDocuments;
import java.awt.GridLayout;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import lectures.mvc.properties.ObservableBMISpreadsheet;
/**
* This class introduces us to the MVC (Model-View-Controller) design pattern.
* A model is just an observable object.
*
* A controller is an object responsible for reacting to input.
*
* A view is an observer of a model responsible for refreshing the display
* in response to model changes
*
* The task of creating the GUI (Graphical User Interface- the display of the controls)
* is a separate one, which is done in a composer object.
*
* Study the code below.
*
* The state (data) shared by the two UIs (OE and custom) is maintained by:
* (a) model
* (b) view
* (c) controller
* (d) widget-tree composer
*
* (T/F) The widgets displaying readonly properties need to accessed by the controller.
* (T/F) The widgets displaying editable properties need to be accessed by the controller.
* (T/F) The widgets displaying readonly properties need to accessed by the view.
* (T/F) The widgets displaying editable properties need to be accessed by the view.
*
*
* (T/F) BMIMVCComposer gives the controller a reference to the model.
* (T/F) BMIMVCCompsoer gives the model a reference to the controller.
* (T/F) BMIMVCComposer creates a connection between the model and controller.
*
* (T/F) BMIMVCCompsoer gives the view a reference to the model.
* (T/F) BMIMVCCompsoer gives the model a reference to the view.
* (T/F) BMIMVCComposer creates a connection between the model and view.
*
* (T/F) A view is an observer.
* (T/F) A model is an observable.
*
* Next class: ABMIFrameComposer
*
*/
@WebDocuments({"Lectures/MvcToolkit.pptx", "Lectures/MvcToolkit.pdf", "Videos/MvcToolkit.avi"})
public class BMIMVCComposer {
public static void edit(ObservableBMISpreadsheet aBMISpreadsheet) {
/*
* ABMIFrameComposer creates the widget tree for the custom GUI.
* It defines getters that access the widgets that display the different
* properties of the model.
*/
BMIFrameComposer aBMIFrameComposer = new ABMIFrameComposer();
/*
* The two widgets that display text are called "text field" widgets.
* The controller needs to react to events in the height and weight fields.
* It can ignore the rest of the widget tree. It also needs access to the model.
*
*/
new ABMISpreadsheetController(aBMISpreadsheet,
aBMIFrameComposer.getHeightField(),
aBMIFrameComposer.getWeightField());
/*
* The view needs access to all leaf-level nodes of the widget tree that show
* updatable values
*/
PropertyChangeListener bmiSpreadsheetView = new ABMISpreadsheetView(
aBMIFrameComposer.getHeightField(),
aBMIFrameComposer.getWeightField(),
aBMIFrameComposer.getBMISlider(),
aBMIFrameComposer.getBMIProgressBar());
/*
* Make the view an observer of the model
*
*/
aBMISpreadsheet.addPropertyChangeListener(bmiSpreadsheetView);
JFrame aBMIFrame = aBMIFrameComposer.composeFrame();
aBMIFrame.setVisible(true);
}
}