<< Chapter < Page Chapter >> Page >

Source code for above classes

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();} }

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Principles of object-oriented programming. OpenStax CNX. May 10, 2013 Download for free at http://legacy.cnx.org/content/col10213/1.37
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Principles of object-oriented programming' conversation and receive update notifications?

Ask