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 {

    private static void createAndShowGUI() {
        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();
    }

    public static void main(String[] args) {
	SwingUtilities.invokeLater(new Runnable() {
	    public void run() {
		createAndShowGUI();
	    }
	});     
    }
}