Swing JFC Java

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// SampleDesktop.java
//Another example that shows how to do a few interesting things using
//JInternalFrames, JDesktopPane, and DesktopManager.
//
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import javax.swing.AbstractAction;
import javax.swing.DefaultDesktopManager;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
public class SampleDesktop extends JFrame {
  private JDesktopPane desk;
  private IconPolice iconPolice = new IconPolice();
  public SampleDesktop(String title) {
    super(title);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    // Create a desktop and set it as the content pane. Don't set the
    // layered
    // pane, since it needs to hold the menu bar too.
    desk = new JDesktopPane();
    setContentPane(desk);
    // Install our custom desktop manager.
    desk.setDesktopManager(new SampleDesktopMgr());
    createMenuBar();
    loadBackgroundImage();
  }
  // Create a menu bar to show off a few things.
  protected void createMenuBar() {
    JMenuBar mb = new JMenuBar();
    JMenu menu = new JMenu("Frames");
    menu.add(new AddFrameAction(true)); // add "upper" frame
    menu.add(new AddFrameAction(false)); // add "lower" frame
    menu.add(new TileAction(desk)); // add tiling capability
    setJMenuBar(mb);
    mb.add(menu);
  }
  // Here we load a background image for our desktop.
  protected void loadBackgroundImage() {
    ImageIcon icon = new ImageIcon("images/matterhorn.gif");
    JLabel l = new JLabel(icon);
    l.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
    // Place the image in the lowest possible layer so nothing
    // can ever be painted under it.
    desk.add(l, new Integer(Integer.MIN_VALUE));
  }
  // This class adds a new JInternalFrame when requested.
  class AddFrameAction extends AbstractAction {
    public AddFrameAction(boolean upper) {
      super(upper ? "Add Upper Frame" : "Add Lower Frame");
      if (upper) {
        this.layer = new Integer(2);
        this.name = "Up";
      } else {
        this.layer = new Integer(1);
        this.name = "Lo";
      }
    }
    public void actionPerformed(ActionEvent ev) {
      JInternalFrame f = new JInternalFrame(name, true, true, true, true);
      f.addVetoableChangeListener(iconPolice);
      f.setBounds(0, 0, 120, 60);
      desk.add(f, layer);
      f.setVisible(true); // Needed since 1.3
    }
    private Integer layer;
    private String name;
  }
  // A simple vetoable change listener that insists that there is always at
  // least one noniconified frame (just as an example of the vetoable
  // properties).
  class IconPolice implements VetoableChangeListener {
    public void vetoableChange(PropertyChangeEvent ev)
        throws PropertyVetoException {
      String name = ev.getPropertyName();
      if (name.equals(JInternalFrame.IS_ICON_PROPERTY)
          && (ev.getNewValue() == Boolean.TRUE)) {
        JInternalFrame[] frames = desk.getAllFrames();
        int count = frames.length;
        int nonicons = 0; // how many are not icons?
        for (int i = 0; i < count; i++) {
          if (!frames[i].isIcon()) {
            nonicons++;
          }
        }
        if (nonicons <= 1) {
          throw new PropertyVetoException("Invalid Iconification!",
              ev);
        }
      }
    }
  }
  // A simple test program.
  public static void main(String[] args) {
    SampleDesktop td = new SampleDesktop("Sample Desktop");
    td.setSize(300, 220);
    td.setVisible(true);
  }
}
//TileAction.java
//An action that tiles all internal frames when requested.
//
class TileAction extends AbstractAction {
  private JDesktopPane desk; // the desktop to work with
  public TileAction(JDesktopPane desk) {
    super("Tile Frames");
    this.desk = desk;
  }
  public void actionPerformed(ActionEvent ev) {
    // How many frames do we have?
    JInternalFrame[] allframes = desk.getAllFrames();
    int count = allframes.length;
    if (count == 0)
      return;
    // Determine the necessary grid size
    int sqrt = (int) Math.sqrt(count);
    int rows = sqrt;
    int cols = sqrt;
    if (rows * cols < count) {
      cols++;
      if (rows * cols < count) {
        rows++;
      }
    }
    // Define some initial values for size & location.
    Dimension size = desk.getSize();
    int w = size.width / cols;
    int h = size.height / rows;
    int x = 0;
    int y = 0;
    // Iterate over the frames, deiconifying any iconified frames and then
    // relocating & resizing each.
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols && ((i * cols) + j < count); j++) {
        JInternalFrame f = allframes[(i * cols) + j];
        if (!f.isClosed() && f.isIcon()) {
          try {
            f.setIcon(false);
          } catch (PropertyVetoException ignored) {
          }
        }
        desk.getDesktopManager().resizeFrame(f, x, y, w, h);
        x += w;
      }
      y += h; // start the next row
      x = 0;
    }
  }
}
//SampleDesktopMgr.java
//A DesktopManager that keeps its frames inside the desktop.
class SampleDesktopMgr extends DefaultDesktopManager {
  // This is called anytime a frame is moved. This
  // implementation keeps the frame from leaving the desktop.
  public void dragFrame(JComponent f, int x, int y) {
    if (f instanceof JInternalFrame) { // Deal only w/internal frames
      JInternalFrame frame = (JInternalFrame) f;
      JDesktopPane desk = frame.getDesktopPane();
      Dimension d = desk.getSize();
      // Nothing all that fancy below, just figuring out how to adjust
      // to keep the frame on the desktop.
      if (x < 0) { // too far left?
        x = 0; // flush against the left side
      } else {
        if (x + frame.getWidth() > d.width) { // too far right?
          x = d.width - frame.getWidth(); // flush against right side
        }
      }
      if (y < 0) { // too high?
        y = 0; // flush against the top
      } else {
        if (y + frame.getHeight() > d.height) { // too low?
          y = d.height - frame.getHeight(); // flush against the
                            // bottom
        }
      }
    }
    // Pass along the (possibly cropped) values to the normal drag handler.
    super.dragFrame(f, x, y);
  }
}