| CartesianPlaneComposer.java |
package lectures.mvc.graphics;
import util.annotations.WebDocuments;
import java.awt.Component;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import lectures.mvc.properties.AnObservableCartesianPlane;
import lectures.mvc.properties.ObservableCartesianPlane;
import lectures.mvc.properties.ObservableStringShape;
import lectures.mvc.properties.atomic.ObservableLine;
import bus.uigen.ObjectEditor;
// GRAPHICS AND MVC
// We have creates using predefined widgets, which are windows with canned behavior.
// Now we will use window directly to do implement custom graphics.
// Run the program, change the AxesLength property in the ObjectEditor user-interface
// and and see what happens to the custom view
@WebDocuments({"Lectures/MvcGraphics.pptx", "Lectures/MvcGraphics.pdf", "Videos/MvcGraphics.avi"})
public class CartesianPlaneComposer {
public static void main(String[] args) {
// As before we ceaate a model
ObservableCartesianPlane cartesianPlane = new AnObservableCartesianPlane(50, 100, 100);
// As before we create a view, but this time we do not pass it it any window/widget
// to the view. The view itself is a window that our code converts to a widget
// It is a single window that shows the whole logical structure of our model,
// we do not create different windows for different parts of the logical structure
// In the BMI example, multiple widgets displayed the same BMI property value.
// This is the dual situation where a single window displays multiple property values
PropertyChangeListener view = new ACartesianPlaneView(cartesianPlane);
// Make the view an observer of the root of the model logical structure
cartesianPlane.addPropertyChangeListener(view);
// Make it also an observer of chidren nodes it displays
((ObservableLine) cartesianPlane.getXAxis()).addPropertyChangeListener(view);
((ObservableLine) cartesianPlane.getYAxis()).addPropertyChangeListener(view);
((ObservableStringShape) cartesianPlane.getXLabel()).addPropertyChangeListener(view);
((ObservableStringShape) cartesianPlane.getYLabel()).addPropertyChangeListener(view);
// Nothing can be displayed unless it is in a top level view
JFrame frame = new JFrame("Cartesian Plane");
// so we add the graphics view to the top level frame
frame.add((Component) view);
frame.setSize(300, 300);
frame.setVisible(true);
// A second view to show view synchronization
ObjectEditor.edit(cartesianPlane);
}
// Go to ACartsianPlaneView to see what is going on there
}