Contents

  1. ./ColoredBackground2.java
  2. ./ColoredBackground.java
  3. ./ColoredBackgroundRefactored.java
  4. ./WindowEventDemo.java

./ColoredBackground2.java 1/4

[
top][prev][next]
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * When a button is pressed, it colors the background of the panel the
 * appropriate color.
 * 
 * Uses a separate class to update the background.
 * 
 * @author sarasprenkle
 * 
 */
public class ColoredBackground2 extends JFrame {

	public ColoredBackground2() {
		setTitle("Colored Background - Separate class");
		setBackground(Color.white);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout());

		// create buttons and add to content pane
		JButton red = new JButton("Red");
		red.setForeground(Color.red);

		JButton green = new JButton("Green");
		green.setForeground(Color.GREEN);
		ColorAction yellowAction = new ColorAction(Color.green, this);
		cp.add(green);

		JButton blue = new JButton("Blue");
		blue.setForeground(Color.blue);

		ColorAction blueAction = new ColorAction(Color.blue, this);
		ColorAction redAction = new ColorAction(Color.red, this);

		green.addActionListener(yellowAction);
		blue.addActionListener(blueAction);
		red.addActionListener(redAction);

		cp.add(red);
		cp.add(blue);

		pack();
		setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ColoredBackground cb = new ColoredBackground();
	}

}

/**
 * This class could (maybe *should*) go in its own file.
 * 
 */
class ColorAction implements ActionListener {
	private Color backgroundColor;
	private JFrame frame;

	public ColorAction(Color c, JFrame frame) {
		backgroundColor = c;
		this.frame = frame;
	}

	public void actionPerformed(ActionEvent evt1) {
		frame.setBackground(backgroundColor);
		frame.repaint();
	}

}

./ColoredBackground.java 2/4

[
top][prev][next]
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * When a button is pressed, it colors the background of the panel the
 * appropriate color.
 * 
 * Uses an inner class.
 * 
 * @author sarasprenkle
 * 
 */
public class ColoredBackground extends JFrame {

	public ColoredBackground() {
		setTitle("Colored Background - Inner Class");
		setBackground(Color.white);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout());

		// create buttons and add to content pane
		JButton red = new JButton("Red");
		red.setForeground(Color.red);

		JButton green = new JButton("Green");
		green.setForeground(Color.GREEN);
		ColorAction yellowAction = new ColorAction(Color.green);
		cp.add(green);

		JButton blue = new JButton("Blue");
		blue.setForeground(Color.blue);

		ColorAction blueAction = new ColorAction(Color.blue);
		ColorAction redAction = new ColorAction(Color.red);

		green.addActionListener(yellowAction);
		blue.addActionListener(blueAction);
		red.addActionListener(redAction);

		cp.add(red);
		cp.add(blue);

		pack();
		setVisible(true);
	}

	/**
	 * Example of inner class that does event handling
	 * 
	 */
	private class ColorAction implements ActionListener {
		private Color backgroundColor;

		public ColorAction(Color c) {
			backgroundColor = c;
		}

		public void actionPerformed(ActionEvent evt1) {
			// ColorAction does not have a setBackground method
			// but ColorBackground/JFrame does
			setBackground(backgroundColor);
			repaint();
		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ColoredBackground cb = new ColoredBackground();
	}

}

./ColoredBackgroundRefactored.java 3/4

[
top][prev][next]
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * When a button is pressed, it colors the background of the panel the
 * appropriate color.
 * <p>
 * Demonstrates using an anonymous inner class
 * 
 * @author Sara Sprenkle
 * 
 */
public class ColoredBackgroundRefactored extends JFrame {

	public ColoredBackgroundRefactored() {
		setTitle("Colored Background - Anonymous Inner Class");
		setBackground(Color.white);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container cp = getContentPane();
		cp.setLayout(new FlowLayout());

		// create buttons and add to content pane
		makeButton("Green", Color.green);
		makeButton("Blue", Color.blue);
		makeButton("Red", Color.red);

		pack();
		setVisible(true);
	}

	/**
	 * Make a button with the given label. Pressing the button will make the
	 * panel background the given background color.
	 * 
	 * @param label
	 * @param backgroundColor
	 */
	private void makeButton(String label, final Color backgroundColor) {
		JButton button = new JButton(label);
		button.setBackground(backgroundColor);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				setBackground(backgroundColor);
				repaint();
			}
		});
		getContentPane().add(button);
	}

	/**
	 * Example of inner class that does event handling
	 * 
	 */
	class ColorAction implements ActionListener {
		private Color backgroundColor;

		public ColorAction(Color c) {
			backgroundColor = c;
		}

		public void actionPerformed(ActionEvent evt1) {
			// ColorAction does not have a setBackground method
			// but ColorBackground/JFrame does
			setBackground(backgroundColor);
			repaint();
		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ColoredBackground cb = new ColoredBackground();
	}

}

./WindowEventDemo.java 4/4

[
top][prev][next]
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * Prints information whenever Window event occurs
 * 
 * @author sprenkle
 * 
 */
public class WindowEventDemo extends JPanel implements WindowListener,
		WindowFocusListener, WindowStateListener {
	final static String newline = "\n";
	final static String space = "    ";
	static JFrame frame;
	JTextArea display;

	public WindowEventDemo() {
		super(new BorderLayout());
		display = new JTextArea();
		display.setEditable(false);
		JScrollPane scrollPane = new JScrollPane(display);
		scrollPane.setPreferredSize(new Dimension(500, 450));
		add(scrollPane, BorderLayout.CENTER);

		frame.addWindowListener(this);
		frame.addWindowFocusListener(this);
		frame.addWindowStateListener(this);

		checkWindowManager();
	}

	// Some window managers don't support all window states.
	// For example, dtwm doesn't support true maximization,
	// but mimics it by resizing the window to be the size
	// of the screen. In this case the window does not fire
	// the MAXIMIZED_ constants on the window's state listener.
	// Microsoft Windows supports MAXIMIZED_BOTH, but not
	// MAXIMIZED_VERT or MAXIMIZED_HORIZ.
	public void checkWindowManager() {
		Toolkit tk = frame.getToolkit();
		if (!(tk.isFrameStateSupported(Frame.ICONIFIED))) {
			displayMessage("Your window manager doesn't support ICONIFIED.");
		}
		if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_VERT))) {
			displayMessage("Your window manager doesn't support MAXIMIZED_VERT.");
		}
		if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_HORIZ))) {
			displayMessage("Your window manager doesn't support MAXIMIZED_HORIZ.");
		}
		if (!(tk.isFrameStateSupported(Frame.MAXIMIZED_BOTH))) {
			displayMessage("Your window manager doesn't support MAXIMIZED_BOTH.");
		} else {
			displayMessage("Your window manager supports MAXIMIZED_BOTH.");
		}
	}

	public void windowClosing(WindowEvent e) {
		displayMessage("WindowListener method called: windowClosing.");

		// A pause so user can see the message before
		// the window actually closes.
		ActionListener task = new ActionListener() {
			boolean alreadyDisposed = false;

			public void actionPerformed(ActionEvent e) {
				if (!alreadyDisposed) {
					alreadyDisposed = true;
					frame.dispose();
				} else { // make sure the program exits
					System.exit(0);
				}
			}
		};
		Timer timer = new Timer(500, task); // fire every half second
		timer.setInitialDelay(2000); // first delay 2 seconds
		timer.start();
	}

	public void windowClosed(WindowEvent e) {
		// This will only be seen on standard output.
		displayMessage("WindowListener method called: windowClosed.");
	}

	public void windowOpened(WindowEvent e) {
		displayMessage("WindowListener method called: windowOpened.");
	}

	public void windowIconified(WindowEvent e) {
		displayMessage("WindowListener method called: windowIconified.");
	}

	public void windowDeiconified(WindowEvent e) {
		displayMessage("WindowListener method called: windowDeiconified.");
	}

	public void windowActivated(WindowEvent e) {
		displayMessage("WindowListener method called: windowActivated.");
	}

	public void windowDeactivated(WindowEvent e) {
		displayMessage("WindowListener method called: windowDeactivated.");
	}

	public void windowGainedFocus(WindowEvent e) {
		displayMessage("WindowFocusListener method called: windowGainedFocus.");
	}

	public void windowLostFocus(WindowEvent e) {
		displayMessage("WindowFocusListener method called: windowLostFocus.");
	}

	public void windowStateChanged(WindowEvent e) {
		displayStateMessage(
				"WindowStateListener method called: windowStateChanged.", e);
	}

	void displayMessage(String msg) {
		display.append(msg + newline);
		System.out.println(msg);
	}

	void displayStateMessage(String prefix, WindowEvent e) {
		int state = e.getNewState();
		int oldState = e.getOldState();
		String msg = prefix + newline + space + "New state: "
				+ convertStateToString(state) + newline + space + "Old state: "
				+ convertStateToString(oldState);
		display.append(msg + newline);
		System.out.println(msg);
	}

	String convertStateToString(int state) {
		if (state == Frame.NORMAL) {
			return "NORMAL";
		}
		if ((state & Frame.ICONIFIED) != 0) {
			return "ICONIFIED";
		}
		// MAXIMIZED_BOTH is a concatenation of two bits, so
		// we need to test for an exact match.
		if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
			return "MAXIMIZED_BOTH";
		}
		if ((state & Frame.MAXIMIZED_VERT) != 0) {
			return "MAXIMIZED_VERT";
		}
		if ((state & Frame.MAXIMIZED_HORIZ) != 0) {
			return "MAXIMIZED_HORIZ";
		}
		return "UNKNOWN";
	}

	/**
	 * Create the GUI and show it. For thread safety, this method should be
	 * invoked from the event-dispatching thread.
	 */
	private static void createAndShowGUI() {
		// Make sure we have nice window decorations.
		JFrame.setDefaultLookAndFeelDecorated(true);

		// Create and set up the window.
		frame = new JFrame("WindowEventDemo");
		frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

		// Create and set up the content pane.
		JComponent newContentPane = new WindowEventDemo();
		newContentPane.setOpaque(true); // content panes must be opaque
		frame.setContentPane(newContentPane);

		// Display the window.
		frame.pack();
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		createAndShowGUI();
	}
}

Generated by GNU enscript 1.6.4.