Java tutorial
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Hashtable; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.LookAndFeel; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.MatteBorder; import javax.swing.event.MouseInputAdapter; import javax.swing.plaf.BorderUIResource; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.FontUIResource; public class LayeredPaneDemo extends JFrame { public LayeredPaneDemo() { super(""); setSize(570, 400); getContentPane().setBackground(new Color(244, 232, 152)); getLayeredPane().setOpaque(true); InnerFrame[] frames = new InnerFrame[5]; for (int i = 0; i < 5; i++) { frames[i] = new InnerFrame("InnerFrame " + i); frames[i].setBounds(50 + i * 20, 50 + i * 20, 200, 200); getLayeredPane().add(frames[i]); } WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo(); } } class InnerFrame extends JPanel { private static String IMAGE_DIR = "mdi" + java.io.File.separator; private static ImageIcon PRESS_RESTORE_BUTTON_ICON = new ImageIcon(IMAGE_DIR + "pressrestore.gif"); private static ImageIcon PRESS_ICONIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR + "pressiconize.gif"); private static final int WIDTH = 200; private static final int HEIGHT = 200; private static final int TITLE_BAR_HEIGHT = 25; private static Color TITLE_BAR_BG_COLOR = new Color(108, 190, 116); private String title; private JLabel titleLabel; private boolean isIconified; private JPanel titlePanel; private JPanel contentPanel; private JPanel buttonPanel; private JPanel buttonWrapperPanel; private InnerFrameButton iconizeButton; private InnerFrameButton closeButton; public InnerFrame(String t) { title = t; setLayout(new BorderLayout()); createTitleBar(); contentPanel = new JPanel(); add(titlePanel, BorderLayout.NORTH); add(contentPanel, BorderLayout.CENTER); } public void toFront() { if (getParent() instanceof JLayeredPane) ((JLayeredPane) getParent()).moveToFront(this); } public void close() { if (getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); jlp.remove(InnerFrame.this); jlp.repaint(); } } public void setIconified(boolean b) { isIconified = b; if (b) { setBounds(getX(), getY(), WIDTH, TITLE_BAR_HEIGHT); } else { setBounds(getX(), getY(), WIDTH, HEIGHT); revalidate(); } } public boolean isIconified() { return isIconified; } // Title Bar public void createTitleBar() { titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.WIDTH, InnerFrame.TITLE_BAR_HEIGHT); } }; titlePanel.setLayout(new BorderLayout()); titlePanel.setOpaque(true); titlePanel.setBackground(TITLE_BAR_BG_COLOR); titleLabel = new JLabel(title); titleLabel.setForeground(Color.black); buttonWrapperPanel = new JPanel(); buttonWrapperPanel.setOpaque(false); buttonPanel = new JPanel(new GridLayout(1, 2)); buttonPanel.setOpaque(false); buttonPanel.setAlignmentX(0.5f); buttonPanel.setAlignmentY(0.5f); buttonWrapperPanel.add(buttonPanel); titlePanel.add(titleLabel, BorderLayout.CENTER); titlePanel.add(buttonWrapperPanel, BorderLayout.EAST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter(this); titlePanel.addMouseListener(iftbma); titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame innerFrame; int xDifference, yDifference; boolean isDragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { innerFrame = inf; } public void mouseDragged(MouseEvent e) { if (isDragging) innerFrame.setLocation(e.getX() - xDifference + getX(), e.getY() - yDifference + getY()); } public void mousePressed(MouseEvent e) { innerFrame.toFront(); xDifference = e.getX(); yDifference = e.getY(); isDragging = true; } public void mouseReleased(MouseEvent e) { isDragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension size; public InnerFrameButton(ImageIcon ii) { super(ii); size = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return size; } public Dimension getMinimumSize() { return size; } public Dimension getMaximumSize() { return size; } } } class InnerFrameUI extends javax.swing.plaf.PanelUI { private static InnerFrameUI frameUI; protected static Color DEFAULT_TITLE_BAR_BG_COLOR; protected static Color DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; protected static Color DEFAULT_TITLE_BAR_FG_COLOR; protected static Color DEFAULT_SELECTED_TITLE_BAR_FG_COLOR; protected static Font DEFAULT_TITLE_BAR_FONT; protected static Border DEFAULT_INNER_FRAME_BORDER; protected static Icon DEFAULT_FRAME_ICON; private static Hashtable myDefaults = new Hashtable(); static { myDefaults.put("InternalFrame.inactiveTitleBackground", new ColorUIResource(108, 190, 116)); myDefaults.put("InternalFrame.inactiveTitleForeground", new ColorUIResource(Color.black)); myDefaults.put("InternalFrame.activeTitleBackground", new ColorUIResource(91, 182, 249)); myDefaults.put("InternalFrame.activeTitleForeground", new ColorUIResource(Color.black)); myDefaults.put("InternalFrame.titleFont", new FontUIResource("Dialog", Font.BOLD, 12)); myDefaults.put("InternalFrame.border", new BorderUIResource(new MatteBorder(4, 4, 4, 4, Color.blue))); } public static ComponentUI createUI(JComponent c) { LookAndFeel currentLF = UIManager.getLookAndFeel(); if (frameUI == null) frameUI = new InnerFrameUI(); try { frameUI.installDefaults(); InnerFrame frame = (InnerFrame) c; frame.setBorder(DEFAULT_INNER_FRAME_BORDER); if (frame.isShowing()) frame.repaint(); } catch (Exception ex) { System.err.println(ex); ex.printStackTrace(); } return frameUI; } public void installUI(JComponent c) { InnerFrame frame = (InnerFrame) c; super.installUI(frame); } public void uninstallUI(JComponent c) { super.uninstallUI(c); } protected void installDefaults() { DEFAULT_TITLE_BAR_BG_COLOR = (Color) findDefaultResource("InternalFrame.inactiveTitleBackground"); DEFAULT_TITLE_BAR_FG_COLOR = (Color) findDefaultResource("InternalFrame.inactiveTitleForeground"); DEFAULT_SELECTED_TITLE_BAR_BG_COLOR = (Color) findDefaultResource("InternalFrame.activeTitleBackground"); DEFAULT_SELECTED_TITLE_BAR_FG_COLOR = (Color) findDefaultResource("InternalFrame.activeTitleForeground"); DEFAULT_TITLE_BAR_FONT = (Font) findDefaultResource("InternalFrame.titleFont"); DEFAULT_INNER_FRAME_BORDER = (Border) findDefaultResource("InternalFrame.border"); DEFAULT_FRAME_ICON = (Icon) findDefaultResource("InternalFrame.icon"); } protected Object findDefaultResource(String id) { Object obj = null; try { UIDefaults uiDef = UIManager.getDefaults(); obj = uiDef.get(id); } catch (Exception ex) { System.err.println(ex); } if (obj == null) obj = myDefaults.get(id); return obj; } public void paint(Graphics g, JComponent c) { super.paint(g, c); if (c.getBorder() != null) c.getBorder().paintBorder(c, g, 0, 0, c.getWidth(), c.getHeight()); } public Color getTitleBarBkColor() { return DEFAULT_TITLE_BAR_BG_COLOR; } public Color getSelectedTitleBarBkColor() { return DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; } public Color getTitleBarFgColor() { return DEFAULT_TITLE_BAR_FG_COLOR; } public Color getSelectedTitleBarFgColor() { return DEFAULT_SELECTED_TITLE_BAR_FG_COLOR; } public Font getTitleBarFont() { return DEFAULT_TITLE_BAR_FONT; } public Border getInnerFrameBorder() { return DEFAULT_INNER_FRAME_BORDER; } }