<< Chapter < Page | Chapter >> Page > |
Frame2.java
package view;
import java.awt.*; // to use Container.import java.awt.event.*; // to use WindowAdpater and WindowEvent.
import javax.swing.*; // to use JFrame./**
* A subclass of AFrame containing two JButtons that have event handler called* "commands" to dynamically switch layout managers when the buttons are clicked
* upon.* @author D.X. Nguyen
*/public class Frame2 extends AFrame {
public Frame2(String title) {super(title);
}protected void initialize() {
Container cp = getContentPane();cp.setLayout(new FlowLayout());JButton jb1 = new JButton("Grid Layout");
JButton jb2 = new JButton("Flow Layout");cp.add(jb1);
cp.add(jb2);pack();
/*** Registers an anonymous event handler for the clicking of button jb1.
* When jb1 is clicked upon, this event handler will respond by* executing its actionPerformed(...) method.
*/jb1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {jb1Clicked(e);
}});
/*** Same as the above.
*/jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {jb2Clicked(e);
}});
}/**
* Dynamically changes to a GridLayout with 2 rows and 1 column.*/
protected void jb1Clicked(ActionEvent e) {System.out.println("Set GridLayout...");
getContentPane().setLayout(new GridLayout(2,1));validate(); // forces this frame to re-layout.
}/**
* Dynamically changes to FlowLayout.*/
protected void jb2Clicked(ActionEvent e) {System.out.println("Set FlowLayout...");
getContentPane().setLayout(new FlowLayout());validate(); // forces this frame to re-layout.
}}
Frame2app.java
package app;
import javax.swing.*;import view.*;
public class Frame2App {public static void main(String[] args) {JFrame f = new Frame2("A JFrame with 2 JButtons with event listeners");
f.setVisible(true);f.setSize(300, 100); // Guess what this does!
f.setLocation(200, 200); // Guess what this does!// Forces the frame to re-layout its components:
f.validate();}
}
Frame3.java
package view;
import java.awt.*;import java.awt.event.*;
import javax.swing.*;/**
* Same functionality as Frame2 but uses an adapter interface to communicate* with the outside world instead. This design allows varying the communication
* with the outside world. How the outside world reacts to the events that* happen to the view is a variant behavior!
* Uses the Null-Object Pattern to initialize the adapter avoiding checking for* null.
* @author DXN*/
public class Frame3 extends Frame2 {// Initializes the adapter to a null object:
private IView2World _v2wAdapter = new IView2World() {public Object button1Clicked (ActionEvent e) {
return null; // does nothing!}
public Object button2Clicked (ActionEvent e) {return null; // does nothing!
}};
public Frame3(String title) {super(title);
}public void setV2WAdapter(IView2World v2w) {
if (null == v2w) {throw new IllegalArgumentException("Argument cannot be null!");
}_v2wAdapter = v2w;
}/**
* Tells _v2wAdapter the button click event happens on jb1.*/
protected void jb1Clicked(ActionEvent e) {_v2wAdapter.button1Clicked(e);
}/**
* Tells _v2wAdapter the button click event happens on jb2.*/
protected void jb2Clicked(ActionEvent e) {_v2wAdapter.button2Clicked(e);
}}
Iview2world.java
package view;
import java.awt.event.*;/**
* Adapter connecting Frame3 (the View) to the outside world.*/
public interface IView2World {/**
* Called by Frame3 when its button 1 is clicked.*/
public Object button1Clicked (ActionEvent e);/**
* Called by Frame3 when its button 2 is clicked.*/
public Object button2Clicked (ActionEvent e);}
Frame3controller.java
package controller;
import view.*;import java.awt.event.*;
import javax.swing.JFrame;import java.awt.*; // For layout managers.
/*** The controller that instantiates a concrete IView2World object and connects
* the world outside of Frame3 (the view) to Frame3.* The concrete adapter is implemented as an anonymous inner classe.
*/public class Frame3Controller {
public JFrame constructFrame() {// Local variable needs to be final so that the local inner class
// can access it:final Frame3 frame = new Frame3("View and Controller");
/*** Install as concrete anonymous IView2World adapter in frame, without
* frame knowing what the adapter does.*/
frame.setV2WAdapter(new IView2World() {public Object button1Clicked (ActionEvent e) {
frame.getContentPane().setLayout(new GridLayout(2,1));frame.validate();
return null;}
public Object button2Clicked (ActionEvent e) {frame.getContentPane().setLayout(new FlowLayout());
frame.validate();return null;
}});
frame.setVisible(true);return frame;
}}
Frame3app.java
package app;
import view.*;import controller.*;
/*** Instantiates the controller and builds the frame!
*/public class Frame3App {
public static void main(String[]args) {
new Frame3Controller().constructFrame().validate();}
}
Notification Switch
Would you like to follow the 'Principles of object-oriented programming' conversation and receive update notifications?