Java/Swing JFC/LayeredPane
Содержание
A demonstration of the JLayeredPane class
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// SimpleLayers.java //A demonstration of the JLayeredPane class. // import java.awt.Color; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; public class SimpleLayers extends JFrame {
public SimpleLayers() { super("LayeredPane Demonstration"); setSize(200, 150); setDefaultCloseOperation(EXIT_ON_CLOSE); JLayeredPane lp = getLayeredPane(); // Create 3 buttons JButton top = new JButton(); top.setBackground(Color.white); top.setBounds(20, 20, 50, 50); JButton middle = new JButton(); middle.setBackground(Color.gray); middle.setBounds(40, 40, 50, 50); JButton bottom = new JButton(); bottom.setBackground(Color.black); bottom.setBounds(60, 60, 50, 50); // Place the buttons in different layers lp.add(middle, new Integer(2)); lp.add(top, new Integer(3)); lp.add(bottom, new Integer(1)); } public static void main(String[] args) { SimpleLayers sl = new SimpleLayers(); sl.setVisible(true); }
}
</source>
Implement buttons at different layers
<source lang="java">
import java.awt.Color; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLayeredPane; public class Main extends JFrame {
public Main() { setSize(200, 150); setDefaultCloseOperation(EXIT_ON_CLOSE); JLayeredPane lp = getLayeredPane(); JButton top = new JButton(); top.setBackground(Color.white); top.setBounds(20, 20, 50, 50); JButton middle = new JButton(); middle.setBackground(Color.gray); middle.setBounds(40, 40, 50, 50); JButton bottom = new JButton(); bottom.setBackground(Color.black); bottom.setBounds(60, 60, 50, 50); lp.add(middle, new Integer(2)); lp.add(top, new Integer(3)); lp.add(bottom, new Integer(1)); setVisible(true); } public static void main(String[] args) { new Main(); }
}
</source>
JLayeredPane Sample
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; public class JLayeredPaneSample {
public static void main(String args[]) { JFrame f = new JFrame("JDesktopPane Sample"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = f.getContentPane(); JLayeredPane desktop = new JDesktopPane(); desktop.setOpaque(false); desktop.add(createLayer("Open 1"), JLayeredPane.POPUP_LAYER); desktop.add(createLayer("Iconified"), JLayeredPane.DEFAULT_LAYER); desktop.add(createLayer("Open 2"), JLayeredPane.PALETTE_LAYER); content.add(desktop, BorderLayout.CENTER); f.setSize(300, 200); f.setVisible(true); } public static JInternalFrame createLayer(String label) { return new SelfInternalFrame(label); } static class SelfInternalFrame extends JInternalFrame { public SelfInternalFrame(String s) { getContentPane().add(new JLabel(s), BorderLayout.CENTER); setBounds(50, 50, 100, 100); setResizable(true); setClosable(true); setMaximizable(true); setIconifiable(true); setTitle(s); setVisible(true); } }
}
</source>
Layered Pane Demo
<source lang="java">
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class LayeredPaneDemo extends JFrame {
public LayeredPaneDemo() { super("Custom MDI: Part II"); 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); } }; Dimension dim = getToolkit().getScreenSize(); setLocation(dim.width/2-getWidth()/2, dim.height/2-getHeight()/2); ImageIcon image = new ImageIcon("spiral.gif"); setIconImage(image.getImage()); addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo(); }
} class InnerFrame extends JPanel {
private static ImageIcon ICONIZE_BUTTON_ICON = new ImageIcon("iconize.gif"); private static ImageIcon RESTORE_BUTTON_ICON = new ImageIcon("restore.gif"); private static ImageIcon CLOSE_BUTTON_ICON = new ImageIcon("close.gif"); private static ImageIcon PRESS_CLOSE_BUTTON_ICON = new ImageIcon("pressclose.gif"); private static ImageIcon PRESS_RESTORE_BUTTON_ICON = new ImageIcon("pressrestore.gif"); private static ImageIcon PRESS_ICONIZE_BUTTON_ICON = new ImageIcon("pressiconize.gif"); private static ImageIcon DEFAULT_FRAME_ICON = new ImageIcon("default.gif"); private static int BORDER_THICKNESS = 4; private static int WIDTH = 200; private static int HEIGHT = 200; private static int TITLE_BAR_HEIGHT = 25; private static int FRAME_ICON_PADDING = 2; private static int ICONIZED_WIDTH = 150; private static Color TITLE_BAR_BG_COLOR = new Color(108,190,116); private static Color BORDER_COLOR = new Color(8,90,16); private int m_titleBarHeight = TITLE_BAR_HEIGHT; private int m_width = WIDTH; private int m_height = HEIGHT; private int m_iconizedWidth = ICONIZED_WIDTH; private String m_title; private JLabel m_titleLabel; private JLabel m_iconLabel; private boolean m_iconified; private boolean m_iconizeable; private boolean m_resizeable; private boolean m_closeable; // used to wrap title bar and contentPanel private JPanel m_frameContentPanel; private JPanel m_titlePanel; private JPanel m_contentPanel; private JPanel m_buttonPanel; private JPanel m_buttonWrapperPanel; private InnerFrameButton m_iconize; private InnerFrameButton m_close; private ImageIcon m_frameIcon = DEFAULT_FRAME_ICON; private NorthResizeEdge m_northResizer; private SouthResizeEdge m_southResizer; private EastResizeEdge m_eastResizer; private WestResizeEdge m_westResizer; public InnerFrame() { this(""); } public InnerFrame(String title) { this(title, null); } public InnerFrame(String title, ImageIcon frameIcon) { this(title, frameIcon, true, true, true); } public InnerFrame(String title, ImageIcon frameIcon, boolean resizeable, boolean iconizeable, boolean closeable) { super.setLayout(new BorderLayout()); attachNorthResizeEdge(); attachSouthResizeEdge(); attachEastResizeEdge(); attachWestResizeEdge(); populateInnerFrame(); setTitle(title); setResizeable(resizeable); setIconizeable(iconizeable); setCloseable(closeable); if (frameIcon != null) setFrameIcon(frameIcon); } protected void populateInnerFrame() { m_frameContentPanel = new JPanel(); m_frameContentPanel.setLayout(new BorderLayout()); createTitleBar(); m_contentPanel = new JPanel(); m_frameContentPanel.add(m_titlePanel, BorderLayout.NORTH); m_frameContentPanel.add(m_contentPanel, BorderLayout.CENTER); super.add(m_frameContentPanel, BorderLayout.CENTER); } public Component add(Component c) { return((m_contentPanel == null) ? null : m_contentPanel.add(c)); } public void setLayout(LayoutManager mgr) { if (m_contentPanel != null) m_contentPanel.setLayout(mgr); } 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 boolean isIconizeable() { return m_iconizeable; } public void setIconizeable(boolean b) { m_iconizeable = b; m_iconize.setVisible(b); m_titlePanel.revalidate(); } public boolean isCloseable() { return m_closeable; } public void setCloseable(boolean b) { m_closeable = b; m_close.setVisible(b); m_titlePanel.revalidate(); } public boolean isIconified() { return m_iconified; } public void setIconified(boolean b) { m_iconified = b; if (b) { m_width = getWidth(); // remember width m_height = getHeight(); // remember height setBounds(getX(), getY(), ICONIZED_WIDTH, m_titleBarHeight + 2*BORDER_THICKNESS); m_iconize.setIcon(RESTORE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_RESTORE_BUTTON_ICON); setResizeable(false); } else { setBounds(getX(), getY(), m_width, m_height); m_iconize.setIcon(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); setResizeable(true); } revalidate(); } //////////////////////////////////////////// //////////////// Title Bar ///////////////// //////////////////////////////////////////// public void setFrameIcon(ImageIcon fi) { m_frameIcon = fi; if (fi != null) { if (m_frameIcon.getIconHeight() > TITLE_BAR_HEIGHT) setTitleBarHeight(m_frameIcon.getIconHeight() + 2*FRAME_ICON_PADDING); m_iconLabel.setIcon(m_frameIcon); } else setTitleBarHeight(TITLE_BAR_HEIGHT); revalidate(); } public ImageIcon getFrameIcon() { return m_frameIcon; } public void setTitle(String s) { m_title = s; m_titleLabel.setText(s); m_titlePanel.repaint(); } public String getTitle() { return m_title; } public void setTitleBarHeight(int h) { m_titleBarHeight = h; } public int getTitleBarHeight() { return m_titleBarHeight; } // create the title bar: m_titlePanel protected void createTitleBar() { m_titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.this.getWidth(), m_titleBarHeight); } }; m_titlePanel.setLayout(new BorderLayout()); m_titlePanel.setOpaque(true); m_titlePanel.setBackground(TITLE_BAR_BG_COLOR); m_titleLabel = new JLabel(); m_titleLabel.setForeground(Color.black); m_close = new InnerFrameButton(CLOSE_BUTTON_ICON); m_close.setPressedIcon(PRESS_CLOSE_BUTTON_ICON); m_close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.close(); } }); m_iconize = new InnerFrameButton(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); m_iconize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setIconified(!InnerFrame.this.isIconified()); } }); m_buttonWrapperPanel = new JPanel(); m_buttonWrapperPanel.setOpaque(false); m_buttonPanel = new JPanel(new GridLayout(1,2)); m_buttonPanel.setOpaque(false); m_buttonPanel.add(m_iconize); m_buttonPanel.add(m_close); m_buttonPanel.setAlignmentX(0.5f); m_buttonPanel.setAlignmentY(0.5f); m_buttonWrapperPanel.add(m_buttonPanel); m_iconLabel = new JLabel(); m_iconLabel.setBorder(new EmptyBorder( FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING)); if (m_frameIcon != null) m_iconLabel.setIcon(m_frameIcon); m_titlePanel.add(m_titleLabel, BorderLayout.CENTER); m_titlePanel.add(m_buttonWrapperPanel, BorderLayout.EAST); m_titlePanel.add(m_iconLabel, BorderLayout.WEST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter(this); m_titlePanel.addMouseListener(iftbma); m_titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame m_if; int m_XDifference, m_YDifference; boolean m_dragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { m_if = inf; } public void mouseDragged(MouseEvent e) { if (m_dragging) m_if.setLocation(e.getX()-m_XDifference + getX(), e.getY()-m_YDifference + getY()); } public void mousePressed(MouseEvent e) { m_if.toFront(); m_XDifference = e.getX(); m_YDifference = e.getY(); m_dragging = true; } public void mouseReleased(MouseEvent e) { m_dragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension m_dim; public InnerFrameButton(ImageIcon ii) { super(ii); m_dim = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return m_dim; } public Dimension getMinimumSize() { return m_dim; } public Dimension getMaximumSize() { return m_dim; } } /////////////////////////////////////////////// //////////////// Resizability ///////////////// /////////////////////////////////////////////// public boolean isResizeable() { return m_resizeable; } public void setResizeable(boolean b) { if (!b && m_resizeable == true) { m_northResizer.removeMouseListener(m_northResizer); m_northResizer.removeMouseMotionListener(m_northResizer); m_southResizer.removeMouseListener(m_southResizer); m_southResizer.removeMouseMotionListener(m_southResizer); m_eastResizer.removeMouseListener(m_eastResizer); m_eastResizer.removeMouseMotionListener(m_eastResizer); m_westResizer.removeMouseListener(m_westResizer); m_westResizer.removeMouseMotionListener(m_westResizer); } else if (m_resizeable == false) { m_northResizer.addMouseListener(m_northResizer); m_northResizer.addMouseMotionListener(m_northResizer); m_southResizer.addMouseListener(m_southResizer); m_southResizer.addMouseMotionListener(m_southResizer); m_eastResizer.addMouseListener(m_eastResizer); m_eastResizer.addMouseMotionListener(m_eastResizer); m_westResizer.addMouseListener(m_westResizer); m_westResizer.addMouseMotionListener(m_westResizer); } m_resizeable = b; } protected void attachNorthResizeEdge() { m_northResizer = new NorthResizeEdge(this); super.add(m_northResizer, BorderLayout.NORTH); } protected void attachSouthResizeEdge() { m_southResizer = new SouthResizeEdge(this); super.add(m_southResizer, BorderLayout.SOUTH); } protected void attachEastResizeEdge() { m_eastResizer = new EastResizeEdge(this); super.add(m_eastResizer, BorderLayout.EAST); } protected void attachWestResizeEdge() { m_westResizer = new WestResizeEdge(this); super.add(m_westResizer, BorderLayout.WEST); } class EastResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private boolean m_dragging; private JComponent m_resizeComponent; protected EastResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth() + e.getX() >= MIN_WIDTH) m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), m_resizeComponent.getWidth() + e.getX(), m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.E_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; } } class WestResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int m_dragX, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; protected WestResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth()- (e.getX()-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds( m_resizeComponent.getX() + (e.getX()-m_dragX), m_resizeComponent.getY(), m_resizeComponent.getWidth()-(e.getX()-m_dragX), m_resizeComponent.getHeight()); else if (m_resizeComponent.getX() + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.W_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_rightX = m_resizeComponent.getX() + m_resizeComponent.getWidth(); m_dragging = true; m_dragX = e.getX(); } } class NorthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int NORTH = 0; private static final int NORTHEAST = 1; private static final int NORTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX, m_lowerY; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected NorthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.N_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case NORTH: if (h-(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w, MIN_HEIGHT); break; case NORTHEAST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w + (ex-(getWidth()-CORNER)), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; case NORTHWEST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y + (ey-m_dragY), w-(ex-m_dragX), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); } else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), m_lowerY-MIN_HEIGHT, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); m_lowerY = m_resizeComponent.getY() + m_resizeComponent.getHeight(); if (e.getX() < CORNER) { m_mode = NORTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = NORTHEAST; } else { m_mode = NORTH; } } } class SouthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int SOUTH = 0; private static final int SOUTHEAST = 1; private static final int SOUTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected SouthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.S_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case SOUTH: if (h+(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, MIN_HEIGHT); break; case SOUTHEAST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y, MIN_WIDTH, h+(ey-m_dragY)); else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, y, MIN_WIDTH, MIN_HEIGHT); break; case SOUTHWEST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); } else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); if (e.getX() < CORNER) { m_mode = SOUTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = SOUTHEAST; } else { m_mode = SOUTH; } } }
}
</source>
LayeredPane Demo 2: Custom MDI
<source lang="java">
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class LayeredPaneDemo2 extends JFrame {
public LayeredPaneDemo2() { super("Custom MDI: Part III"); setSize(570,400); getContentPane().setBackground(new Color(244,232,152)); getLayeredPane().setOpaque(true); // VERY IMPORTANT!! ImageIcon ii = new ImageIcon("earth.jpg"); 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); frames[i].getContentPane().add(new JScrollPane(new JLabel(ii))); getLayeredPane().add(frames[i]); } WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; Dimension dim = getToolkit().getScreenSize(); setLocation(dim.width/2-getWidth()/2, dim.height/2-getHeight()/2); ImageIcon image = new ImageIcon("spiral.gif"); setIconImage(image.getImage()); addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo2(); }
} class InnerFrame extends JPanel implements RootPaneContainer {
private static ImageIcon ICONIZE_BUTTON_ICON = new ImageIcon("iconize.gif"); private static ImageIcon RESTORE_BUTTON_ICON = new ImageIcon("restore.gif"); private static ImageIcon CLOSE_BUTTON_ICON = new ImageIcon("close.gif"); private static ImageIcon MAXIMIZE_BUTTON_ICON = new ImageIcon("maximize.gif"); private static ImageIcon MINIMIZE_BUTTON_ICON = new ImageIcon("minimize.gif"); private static ImageIcon PRESS_CLOSE_BUTTON_ICON = new ImageIcon("pressclose.gif"); private static ImageIcon PRESS_RESTORE_BUTTON_ICON = new ImageIcon("pressrestore.gif"); private static ImageIcon PRESS_ICONIZE_BUTTON_ICON = new ImageIcon("pressiconize.gif"); private static ImageIcon PRESS_MAXIMIZE_BUTTON_ICON = new ImageIcon("pressmaximize.gif"); private static ImageIcon PRESS_MINIMIZE_BUTTON_ICON = new ImageIcon("pressminimize.gif"); private static ImageIcon DEFAULT_FRAME_ICON = new ImageIcon("default.gif"); private static int BORDER_THICKNESS = 4; private static int WIDTH = 200; private static int HEIGHT = 200; private static int TITLE_BAR_HEIGHT = 25; private static int FRAME_ICON_PADDING = 2; private static int ICONIZED_WIDTH = 150; private static Color TITLE_BAR_BG_COLOR = new Color(108,190,116); private static Color BORDER_COLOR = new Color(8,90,16); private int m_titleBarHeight = TITLE_BAR_HEIGHT; private int m_width = WIDTH; private int m_height = HEIGHT; private int m_iconizedWidth = ICONIZED_WIDTH; private int m_x; private int m_y; private String m_title; private JLabel m_titleLabel; private JLabel m_iconLabel; private boolean m_iconified; private boolean m_maximized; private boolean m_iconizeable; private boolean m_resizeable; private boolean m_closeable; private boolean m_maximizeable; // only false when maximized private boolean m_draggable = true; private JRootPane m_rootPane; // used to wrap m_titlePanel and m_rootPane private JPanel m_frameContentPanel; private JPanel m_titlePanel; private JPanel m_contentPanel; private JPanel m_buttonPanel; private JPanel m_buttonWrapperPanel; private InnerFrameButton m_iconize; private InnerFrameButton m_close; private InnerFrameButton m_maximize; private ImageIcon m_frameIcon = DEFAULT_FRAME_ICON; private NorthResizeEdge m_northResizer; private SouthResizeEdge m_southResizer; private EastResizeEdge m_eastResizer; private WestResizeEdge m_westResizer; public InnerFrame() { this(""); } public InnerFrame(String title) { this(title, null); } public InnerFrame(String title, ImageIcon frameIcon) { this(title, frameIcon, true, true, true, true); } public InnerFrame(String title, ImageIcon frameIcon, boolean resizeable, boolean iconizeable, boolean maximizeable, boolean closeable) { super.setLayout(new BorderLayout()); attachNorthResizeEdge(); attachSouthResizeEdge(); attachEastResizeEdge(); attachWestResizeEdge(); populateInnerFrame(); setTitle(title); setResizeable(resizeable); setIconizeable(iconizeable); setCloseable(closeable); setMaximizeable(maximizeable); if (frameIcon != null) setFrameIcon(frameIcon); } protected void populateInnerFrame() { m_rootPane = new JRootPane(); m_frameContentPanel = new JPanel(); m_frameContentPanel.setLayout(new BorderLayout()); createTitleBar(); m_contentPanel = new JPanel(new BorderLayout()); m_rootPane.setContentPane(m_contentPanel); m_frameContentPanel.add(m_titlePanel, BorderLayout.NORTH); m_frameContentPanel.add(m_rootPane, BorderLayout.CENTER); setupCapturePanel(); super.add(m_frameContentPanel, BorderLayout.CENTER); } protected void setupCapturePanel() { CapturePanel mouseTrap = new CapturePanel(); m_rootPane.getLayeredPane().add(mouseTrap, new Integer(Integer.MIN_VALUE)); mouseTrap.setBounds(0,0,10000,10000); } // don"t allow this in root pane containers public Component add(Component c) { return null; } // don"t allow this in root pane containers public void setLayout(LayoutManager mgr) { } public JMenuBar getJMenuBar() { return m_rootPane.getJMenuBar(); } public JRootPane getRootPane() { return m_rootPane; } public Container getContentPane() { return m_rootPane.getContentPane(); } public Component getGlassPane() { return m_rootPane.getGlassPane(); } public JLayeredPane getLayeredPane() { return m_rootPane.getLayeredPane(); } public void setJMenuBar(JMenuBar menu) { m_rootPane.setJMenuBar(menu); } public void setContentPane(Container content) { m_rootPane.setContentPane(content); } public void setGlassPane(Component glass) { m_rootPane.setGlassPane(glass); } public void setLayeredPane(JLayeredPane layered) { m_rootPane.setLayeredPane(layered); } 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 boolean isIconizeable() { return m_iconizeable; } public void setIconizeable(boolean b) { m_iconizeable = b; m_iconize.setVisible(b); m_titlePanel.revalidate(); } public boolean isCloseable() { return m_closeable; } public void setCloseable(boolean b) { m_closeable = b; m_close.setVisible(b); m_titlePanel.revalidate(); } public boolean isMaximizeable() { return m_maximizeable; } public void setMaximizeable(boolean b) { m_maximizeable = b; m_maximize.setVisible(b); m_titlePanel.revalidate(); } public boolean isIconified() { return m_iconified; } public void setIconified(boolean b) { m_iconified = b; if (b) { if (isMaximized()) setMaximized(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height setBounds(getX(), getY(), ICONIZED_WIDTH, m_titleBarHeight + 2*BORDER_THICKNESS); m_iconize.setIcon(RESTORE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_RESTORE_BUTTON_ICON); setResizeable(false); } else { toFront(); setBounds(getX(), getY(), m_width, m_height); m_iconize.setIcon(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); setResizeable(true); } revalidate(); } public boolean isMaximized() { return m_maximized; } public void setMaximized(boolean b) { m_maximized = b; if (b) { if (isIconified()) setIconified(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height m_x = getX(); // remember x m_y = getY(); // remember y setBounds(0, 0, getParent().getWidth(), getParent().getHeight()); m_maximize.setIcon(MINIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MINIMIZE_BUTTON_ICON); setResizeable(false); setDraggable(false); } else { toFront(); setBounds(m_x, m_y, m_width, m_height); m_maximize.setIcon(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); setResizeable(true); setDraggable(true); } revalidate(); } //////////////////////////////////////////// //////////////// Title Bar ///////////////// //////////////////////////////////////////// public void setFrameIcon(ImageIcon fi) { m_frameIcon = fi; if (fi != null) { if (m_frameIcon.getIconHeight() > TITLE_BAR_HEIGHT) setTitleBarHeight(m_frameIcon.getIconHeight() + 2*FRAME_ICON_PADDING); m_iconLabel.setIcon(m_frameIcon); } else setTitleBarHeight(TITLE_BAR_HEIGHT); revalidate(); } public ImageIcon getFrameIcon() { return m_frameIcon; } public void setTitle(String s) { m_title = s; m_titleLabel.setText(s); m_titlePanel.repaint(); } public String getTitle() { return m_title; } public void setTitleBarHeight(int h) { m_titleBarHeight = h; } public int getTitleBarHeight() { return m_titleBarHeight; } public boolean isDraggable() { return m_draggable; } private void setDraggable(boolean b) { m_draggable = b; } // create the title bar: m_titlePanel protected void createTitleBar() { m_titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.this.getWidth(), m_titleBarHeight); } }; m_titlePanel.setLayout(new BorderLayout()); m_titlePanel.setOpaque(true); m_titlePanel.setBackground(TITLE_BAR_BG_COLOR); m_titleLabel = new JLabel(); m_titleLabel.setForeground(Color.black); m_close = new InnerFrameButton(CLOSE_BUTTON_ICON); m_close.setPressedIcon(PRESS_CLOSE_BUTTON_ICON); m_close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.close(); } }); m_maximize = new InnerFrameButton(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); m_maximize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setMaximized(!InnerFrame.this.isMaximized()); } }); m_iconize = new InnerFrameButton(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); m_iconize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setIconified(!InnerFrame.this.isIconified()); } }); m_buttonWrapperPanel = new JPanel(); m_buttonWrapperPanel.setOpaque(false); m_buttonPanel = new JPanel(new GridLayout(1,3)); m_buttonPanel.setOpaque(false); m_buttonPanel.add(m_iconize); m_buttonPanel.add(m_maximize); m_buttonPanel.add(m_close); m_buttonPanel.setAlignmentX(0.5f); m_buttonPanel.setAlignmentY(0.5f); m_buttonWrapperPanel.add(m_buttonPanel); m_iconLabel = new JLabel(); m_iconLabel.setBorder(new EmptyBorder( FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING)); if (m_frameIcon != null) m_iconLabel.setIcon(m_frameIcon); m_titlePanel.add(m_titleLabel, BorderLayout.CENTER); m_titlePanel.add(m_buttonWrapperPanel, BorderLayout.EAST); m_titlePanel.add(m_iconLabel, BorderLayout.WEST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter(this); m_titlePanel.addMouseListener(iftbma); m_titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame m_if; int m_XDifference, m_YDifference; boolean m_dragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { m_if = inf; } // don"t allow dragging outside of parent public void mouseDragged(MouseEvent e) { int ex = e.getX(); int ey = e.getY(); int x = m_if.getX(); int y = m_if.getY(); int w = m_if.getParent().getWidth(); int h = m_if.getParent().getHeight(); if (m_dragging & m_if.isDraggable()) { if ((ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) m_if.setLocation(ex-m_XDifference + x, ey-m_YDifference + y); else if (!(ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) { if (!(ey + y > 0) && ey + y < h) m_if.setLocation(ex-m_XDifference + x, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h)) m_if.setLocation(ex-m_XDifference + x, h-m_YDifference); } else if ((ey + y > 0 && ey + y < h) && !(ex + x > 0 && ex + x < w)) { if (!(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, ey-m_YDifference + y); else if (ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, ey-m_YDifference + y); } else if (!(ey + y > 0) && ey + y < h && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, 0-m_YDifference); else if (!(ey + y > 0) && ey + y < h && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, h-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, h-m_YDifference); } } public void mousePressed(MouseEvent e) { m_if.toFront(); m_XDifference = e.getX(); m_YDifference = e.getY(); m_dragging = true; } public void mouseReleased(MouseEvent e) { m_dragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension m_dim; public InnerFrameButton(ImageIcon ii) { super(ii); m_dim = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return m_dim; } public Dimension getMinimumSize() { return m_dim; } public Dimension getMaximumSize() { return m_dim; } } /////////////////////////////////////////////// /////////// Mouse Event Capturing ///////////// /////////////////////////////////////////////// class CapturePanel extends JPanel { public CapturePanel() { MouseInputAdapter mia = new MouseInputAdapter() {}; addMouseListener(mia); addMouseMotionListener(mia); } } /////////////////////////////////////////////// //////////////// Resizability ///////////////// /////////////////////////////////////////////// public boolean isResizeable() { return m_resizeable; } public void setResizeable(boolean b) { if (!b && m_resizeable == true) { m_northResizer.removeMouseListener(m_northResizer); m_northResizer.removeMouseMotionListener(m_northResizer); m_southResizer.removeMouseListener(m_southResizer); m_southResizer.removeMouseMotionListener(m_southResizer); m_eastResizer.removeMouseListener(m_eastResizer); m_eastResizer.removeMouseMotionListener(m_eastResizer); m_westResizer.removeMouseListener(m_westResizer); m_westResizer.removeMouseMotionListener(m_westResizer); } else if (b && m_resizeable == false) { m_northResizer.addMouseListener(m_northResizer); m_northResizer.addMouseMotionListener(m_northResizer); m_southResizer.addMouseListener(m_southResizer); m_southResizer.addMouseMotionListener(m_southResizer); m_eastResizer.addMouseListener(m_eastResizer); m_eastResizer.addMouseMotionListener(m_eastResizer); m_westResizer.addMouseListener(m_westResizer); m_westResizer.addMouseMotionListener(m_westResizer); } m_resizeable = b; } protected void attachNorthResizeEdge() { m_northResizer = new NorthResizeEdge(this); super.add(m_northResizer, BorderLayout.NORTH); } protected void attachSouthResizeEdge() { m_southResizer = new SouthResizeEdge(this); super.add(m_southResizer, BorderLayout.SOUTH); } protected void attachEastResizeEdge() { m_eastResizer = new EastResizeEdge(this); super.add(m_eastResizer, BorderLayout.EAST); } protected void attachWestResizeEdge() { m_westResizer = new WestResizeEdge(this); super.add(m_westResizer, BorderLayout.WEST); } class EastResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private boolean m_dragging; private JComponent m_resizeComponent; protected EastResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth() + e.getX() >= MIN_WIDTH) m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), m_resizeComponent.getWidth() + e.getX(), m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.E_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; } } class WestResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int m_dragX, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; protected WestResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth()- (e.getX()-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds( m_resizeComponent.getX() + (e.getX()-m_dragX), m_resizeComponent.getY(), m_resizeComponent.getWidth()-(e.getX()-m_dragX), m_resizeComponent.getHeight()); else if (m_resizeComponent.getX() + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.W_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_rightX = m_resizeComponent.getX() + m_resizeComponent.getWidth(); m_dragging = true; m_dragX = e.getX(); } } class NorthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int NORTH = 0; private static final int NORTHEAST = 1; private static final int NORTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX, m_lowerY; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected NorthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.N_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case NORTH: if (h-(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w, MIN_HEIGHT); break; case NORTHEAST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w + (ex-(getWidth()-CORNER)), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; case NORTHWEST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y + (ey-m_dragY), w-(ex-m_dragX), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); } else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), m_lowerY-MIN_HEIGHT, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); m_lowerY = m_resizeComponent.getY() + m_resizeComponent.getHeight(); if (e.getX() < CORNER) { m_mode = NORTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = NORTHEAST; } else { m_mode = NORTH; } } } class SouthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int SOUTH = 0; private static final int SOUTHEAST = 1; private static final int SOUTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected SouthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(BORDER_COLOR); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.S_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case SOUTH: if (h+(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, MIN_HEIGHT); break; case SOUTHEAST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y, MIN_WIDTH, h+(ey-m_dragY)); else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, y, MIN_WIDTH, MIN_HEIGHT); break; case SOUTHWEST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); } else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); if (e.getX() < CORNER) { m_mode = SOUTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = SOUTHEAST; } else { m_mode = SOUTH; } } }
}
</source>
LayeredPane Demo 3: Custom MDI
<source lang="java">
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class LayeredPaneDemo3 extends JFrame {
public LayeredPaneDemo3() { super("Custom MDI: Part IV"); setSize(570,400); getContentPane().setBackground(new Color(244,232,152)); setLayeredPane(new MDIPane()); ImageIcon ii = new ImageIcon("earth.jpg"); 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); frames[i].getContentPane().add( new JScrollPane(new JLabel(ii))); getLayeredPane().add(frames[i]); } WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; Dimension dim = getToolkit().getScreenSize(); setLocation(dim.width/2-getWidth()/2, dim.height/2-getHeight()/2); ImageIcon image = new ImageIcon("spiral.gif"); setIconImage(image.getImage()); addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo3(); }
} class InnerFrame extends JPanel implements RootPaneContainer {
private static String IMAGE_DIR = "mdi" + java.io.File.separator; private static ImageIcon ICONIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"iconize.gif"); private static ImageIcon RESTORE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"restore.gif"); private static ImageIcon CLOSE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"close.gif"); private static ImageIcon MAXIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"maximize.gif"); private static ImageIcon MINIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"minimize.gif"); private static ImageIcon PRESS_CLOSE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressclose.gif"); 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 ImageIcon PRESS_MAXIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressmaximize.gif"); private static ImageIcon PRESS_MINIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressminimize.gif"); private static ImageIcon DEFAULT_FRAME_ICON = new ImageIcon(IMAGE_DIR+"default.gif"); private static int BORDER_THICKNESS = 4; private static int WIDTH = 200; private static int HEIGHT = 200; private static int TITLE_BAR_HEIGHT = 25; private static int FRAME_ICON_PADDING = 2; private static int ICONIZED_WIDTH = 150; private static Color DEFAULT_TITLE_BAR_BG_COLOR = new Color(108,190,116); private static Color DEFAULT_BORDER_COLOR = new Color(8,90,16); private static Color DEFAULT_SELECTED_TITLE_BAR_BG_COLOR = new Color(91,182,249); private static Color DEFAULT_SELECTED_BORDER_COLOR = new Color(0,82,149); private Color m_titleBarBackground = DEFAULT_TITLE_BAR_BG_COLOR; private Color m_titleBarForeground = Color.black; private Color m_BorderColor = DEFAULT_BORDER_COLOR; private Color m_selectedTitleBarBackground = DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; private Color m_selectedBorderColor = DEFAULT_SELECTED_BORDER_COLOR; private int m_titleBarHeight = TITLE_BAR_HEIGHT; private int m_width = WIDTH; private int m_height = HEIGHT; private int m_iconizedWidth = ICONIZED_WIDTH; private int m_x; private int m_y; private String m_title; private JLabel m_titleLabel; private JLabel m_iconLabel; private boolean m_iconified; private boolean m_maximized; private boolean m_selected; private boolean m_iconizeable; private boolean m_resizeable; private boolean m_closeable; private boolean m_maximizeable; // only false when maximized private boolean m_draggable = true; private JRootPane m_rootPane; // used to wrap m_titlePanel and m_rootPane private JPanel m_frameContentPanel; private JPanel m_titlePanel; private JPanel m_contentPanel; private JPanel m_buttonPanel; private JPanel m_buttonWrapperPanel; private InnerFrameButton m_iconize; private InnerFrameButton m_close; private InnerFrameButton m_maximize; private ImageIcon m_frameIcon = DEFAULT_FRAME_ICON; private NorthResizeEdge m_northResizer; private SouthResizeEdge m_southResizer; private EastResizeEdge m_eastResizer; private WestResizeEdge m_westResizer; public InnerFrame() { this(""); } public InnerFrame(String title) { this(title, null); } public InnerFrame(String title, ImageIcon frameIcon) { this(title, frameIcon, true, true, true, true); } public InnerFrame(String title, ImageIcon frameIcon, boolean resizeable, boolean iconizeable, boolean maximizeable, boolean closeable) { super.setLayout(new BorderLayout()); attachNorthResizeEdge(); attachSouthResizeEdge(); attachEastResizeEdge(); attachWestResizeEdge(); populateInnerFrame(); setTitle(title); setResizeable(resizeable); setIconizeable(iconizeable); setCloseable(closeable); setMaximizeable(maximizeable); if (frameIcon != null) setFrameIcon(frameIcon); } protected void populateInnerFrame() { m_rootPane = new JRootPane(); m_frameContentPanel = new JPanel(); m_frameContentPanel.setLayout(new BorderLayout()); createTitleBar(); m_contentPanel = new JPanel(new BorderLayout()); setContentPane(m_contentPanel); m_frameContentPanel.add(m_titlePanel, BorderLayout.NORTH); m_frameContentPanel.add(m_rootPane, BorderLayout.CENTER); setupCapturePanel(); super.add(m_frameContentPanel, BorderLayout.CENTER); } protected void setupCapturePanel() { CapturePanel mouseTrap = new CapturePanel(); m_rootPane.getLayeredPane().add(mouseTrap, new Integer(Integer.MIN_VALUE)); mouseTrap.setBounds(0,0,10000,10000); setGlassPane(new GlassCapturePanel()); getGlassPane().setVisible(true); } // don"t allow this in root pane containers public Component add(Component c) { return null; } // don"t allow this in root pane containers public void setLayout(LayoutManager mgr) { } public JMenuBar getJMenuBar() { return m_rootPane.getJMenuBar(); } public JRootPane getRootPane() { return m_rootPane; } public Container getContentPane() { return m_rootPane.getContentPane(); } public Component getGlassPane() { return m_rootPane.getGlassPane(); } public JLayeredPane getLayeredPane() { return m_rootPane.getLayeredPane(); } public void setJMenuBar(JMenuBar menu) { m_rootPane.setJMenuBar(menu); } public void setContentPane(Container content) { m_rootPane.setContentPane(content); } public void setGlassPane(Component glass) { m_rootPane.setGlassPane(glass); } public void setLayeredPane(JLayeredPane layered) { m_rootPane.setLayeredPane(layered); } public void toFront() { if (getParent() instanceof JLayeredPane) ((JLayeredPane) getParent()).moveToFront(this); if (!isSelected()) setSelected(true); } public void close() { if (getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); jlp.remove(InnerFrame.this); jlp.repaint(); } } public boolean isIconizeable() { return m_iconizeable; } public void setIconizeable(boolean b) { m_iconizeable = b; m_iconize.setVisible(b); m_titlePanel.revalidate(); } public boolean isCloseable() { return m_closeable; } public void setCloseable(boolean b) { m_closeable = b; m_close.setVisible(b); m_titlePanel.revalidate(); } public boolean isMaximizeable() { return m_maximizeable; } public void setMaximizeable(boolean b) { m_maximizeable = b; m_maximize.setVisible(b); m_titlePanel.revalidate(); } public boolean isIconified() { return m_iconified; } public void setIconified(boolean b) { m_iconified = b; if (b) { if (isMaximized()) setMaximized(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height setBounds(getX(), getY(), ICONIZED_WIDTH, m_titleBarHeight + 2*BORDER_THICKNESS); m_iconize.setIcon(RESTORE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_RESTORE_BUTTON_ICON); setResizeable(false); } else { toFront(); setBounds(getX(), getY(), m_width, m_height); m_iconize.setIcon(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); setResizeable(true); } revalidate(); } public boolean isMaximized() { return m_maximized; } public void setMaximized(boolean b) { m_maximized = b; if (b) { if (isIconified()) setIconified(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height m_x = getX(); // remember x m_y = getY(); // remember y setBounds(0, 0, getParent().getWidth(), getParent().getHeight()); m_maximize.setIcon(MINIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MINIMIZE_BUTTON_ICON); setResizeable(false); setDraggable(false); } else { toFront(); setBounds(m_x, m_y, m_width, m_height); m_maximize.setIcon(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); setResizeable(true); setDraggable(true); } revalidate(); } public boolean isSelected() { return m_selected; } public void setSelected(boolean b) { if (b) { if (m_selected != true && getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); int layer = jlp.getLayer(this); Component[] components = jlp.getComponentsInLayer(layer); for (int i=0; i<components.length; i++) { if (components[i] instanceof InnerFrame) { InnerFrame tempFrame = (InnerFrame) components[i]; if (!tempFrame.equals(this)) tempFrame.setSelected(false); } } m_selected = true; updateBorderColors(); updateTitleBarColors(); getGlassPane().setVisible(false); repaint(); } } else { m_selected = false; updateBorderColors(); updateTitleBarColors(); getGlassPane().setVisible(true); repaint(); } } //////////////////////////////////////////// //////////////// Title Bar ///////////////// //////////////////////////////////////////// public void setTitleBarBackground(Color c) { m_titleBarBackground = c; updateTitleBarColors(); } public Color getTitleBarBackground() { return m_titleBarBackground; } public void setTitleBarForeground(Color c) { m_titleBarForeground = c; m_titleLabel.setForeground(c); m_titlePanel.repaint(); } public Color getTitleBarForeground() { return m_titleBarForeground; } public void setSelectedTitleBarBackground(Color c) { m_titleBarBackground = c; updateTitleBarColors(); } public Color getSelectedTitleBarBackground() { return m_selectedTitleBarBackground; } protected void updateTitleBarColors() { if (isSelected()) m_titlePanel.setBackground(m_selectedTitleBarBackground); else m_titlePanel.setBackground(m_titleBarBackground); } public void setFrameIcon(ImageIcon fi) { m_frameIcon = fi; if (fi != null) { if (m_frameIcon.getIconHeight() > TITLE_BAR_HEIGHT) setTitleBarHeight(m_frameIcon.getIconHeight() + 2*FRAME_ICON_PADDING); m_iconLabel.setIcon(m_frameIcon); } else setTitleBarHeight(TITLE_BAR_HEIGHT); revalidate(); } public ImageIcon getFrameIcon() { return m_frameIcon; } public void setTitle(String s) { m_title = s; m_titleLabel.setText(s); m_titlePanel.repaint(); } public String getTitle() { return m_title; } public void setTitleBarHeight(int h) { m_titleBarHeight = h; } public int getTitleBarHeight() { return m_titleBarHeight; } public boolean isDraggable() { return m_draggable; } private void setDraggable(boolean b) { m_draggable = b; } // create the title bar: m_titlePanel protected void createTitleBar() { m_titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.this.getWidth(), m_titleBarHeight); } }; m_titlePanel.setLayout(new BorderLayout()); m_titlePanel.setOpaque(true); m_titlePanel.setBackground(m_titleBarBackground); m_titleLabel = new JLabel(); m_titleLabel.setForeground(m_titleBarForeground); m_close = new InnerFrameButton(CLOSE_BUTTON_ICON); m_close.setPressedIcon(PRESS_CLOSE_BUTTON_ICON); m_close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.close(); } }); m_maximize = new InnerFrameButton(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); m_maximize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setMaximized(!InnerFrame.this.isMaximized()); } }); m_iconize = new InnerFrameButton(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); m_iconize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setIconified(!InnerFrame.this.isIconified()); } }); m_buttonWrapperPanel = new JPanel(); m_buttonWrapperPanel.setOpaque(false); m_buttonPanel = new JPanel(new GridLayout(1,3)); m_buttonPanel.setOpaque(false); m_buttonPanel.add(m_iconize); m_buttonPanel.add(m_maximize); m_buttonPanel.add(m_close); m_buttonPanel.setAlignmentX(0.5f); m_buttonPanel.setAlignmentY(0.5f); m_buttonWrapperPanel.add(m_buttonPanel); m_iconLabel = new JLabel(); m_iconLabel.setBorder(new EmptyBorder( FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING)); if (m_frameIcon != null) m_iconLabel.setIcon(m_frameIcon); m_titlePanel.add(m_titleLabel, BorderLayout.CENTER); m_titlePanel.add(m_buttonWrapperPanel, BorderLayout.EAST); m_titlePanel.add(m_iconLabel, BorderLayout.WEST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter(this); m_titlePanel.addMouseListener(iftbma); m_titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame m_if; int m_XDifference, m_YDifference; boolean m_dragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { m_if = inf; } // don"t allow dragging outside of parent public void mouseDragged(MouseEvent e) { int ex = e.getX(); int ey = e.getY(); int x = m_if.getX(); int y = m_if.getY(); int w = m_if.getParent().getWidth(); int h = m_if.getParent().getHeight(); if (m_dragging & m_if.isDraggable()) { if ((ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) m_if.setLocation(ex-m_XDifference + x, ey-m_YDifference + y); else if (!(ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) { if (!(ey + y > 0) && ey + y < h) m_if.setLocation(ex-m_XDifference + x, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h)) m_if.setLocation(ex-m_XDifference + x, h-m_YDifference); } else if ((ey + y > 0 && ey + y < h) && !(ex + x > 0 && ex + x < w)) { if (!(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, ey-m_YDifference + y); else if (ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, ey-m_YDifference + y); } else if (!(ey + y > 0) && ey + y < h && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, 0-m_YDifference); else if (!(ey + y > 0) && ey + y < h && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, h-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, h-m_YDifference); } } public void mousePressed(MouseEvent e) { m_if.toFront(); m_XDifference = e.getX(); m_YDifference = e.getY(); m_dragging = true; } public void mouseReleased(MouseEvent e) { m_dragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension m_dim; public InnerFrameButton(ImageIcon ii) { super(ii); m_dim = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return m_dim; } public Dimension getMinimumSize() { return m_dim; } public Dimension getMaximumSize() { return m_dim; } } /////////////////////////////////////////////// /////////// Mouse Event Capturing ///////////// /////////////////////////////////////////////// class CapturePanel extends JPanel { public CapturePanel() { MouseInputAdapter mia = new MouseInputAdapter() {}; addMouseListener(mia); addMouseMotionListener(mia); } } /////////////////////////////////////////////// ///////////// GlassPane Selector ////////////// /////////////////////////////////////////////// class GlassCapturePanel extends JPanel { public GlassCapturePanel() { MouseInputAdapter mia = new MouseInputAdapter() { public void mousePressed(MouseEvent e) { InnerFrame.this.toFront(); } }; addMouseListener(mia); addMouseMotionListener(mia); setOpaque(false); } } /////////////////////////////////////////////// //////////////// Resizability ///////////////// /////////////////////////////////////////////// public void setBorderColor(Color c) { m_BorderColor = c; updateBorderColors(); } public Color getBorderColor() { return m_BorderColor; } public void setSelectedBorderColor(Color c) { m_selectedBorderColor = c; updateBorderColors(); } public Color getSelectedBorderColor() { return m_selectedBorderColor; } protected void updateBorderColors() { if (isSelected()) { m_northResizer.setBackground(m_selectedBorderColor); m_southResizer.setBackground(m_selectedBorderColor); m_eastResizer.setBackground(m_selectedBorderColor); m_westResizer.setBackground(m_selectedBorderColor); } else { m_northResizer.setBackground(m_BorderColor); m_southResizer.setBackground(m_BorderColor); m_eastResizer.setBackground(m_BorderColor); m_westResizer.setBackground(m_BorderColor); } } public boolean isResizeable() { return m_resizeable; } public void setResizeable(boolean b) { if (!b && m_resizeable == true) { m_northResizer.removeMouseListener(m_northResizer); m_northResizer.removeMouseMotionListener(m_northResizer); m_southResizer.removeMouseListener(m_southResizer); m_southResizer.removeMouseMotionListener(m_southResizer); m_eastResizer.removeMouseListener(m_eastResizer); m_eastResizer.removeMouseMotionListener(m_eastResizer); m_westResizer.removeMouseListener(m_westResizer); m_westResizer.removeMouseMotionListener(m_westResizer); } else if (b && m_resizeable == false) { m_northResizer.addMouseListener(m_northResizer); m_northResizer.addMouseMotionListener(m_northResizer); m_southResizer.addMouseListener(m_southResizer); m_southResizer.addMouseMotionListener(m_southResizer); m_eastResizer.addMouseListener(m_eastResizer); m_eastResizer.addMouseMotionListener(m_eastResizer); m_westResizer.addMouseListener(m_westResizer); m_westResizer.addMouseMotionListener(m_westResizer); } m_resizeable = b; } protected void attachNorthResizeEdge() { m_northResizer = new NorthResizeEdge(this); super.add(m_northResizer, BorderLayout.NORTH); } protected void attachSouthResizeEdge() { m_southResizer = new SouthResizeEdge(this); super.add(m_southResizer, BorderLayout.SOUTH); } protected void attachEastResizeEdge() { m_eastResizer = new EastResizeEdge(this); super.add(m_eastResizer, BorderLayout.EAST); } protected void attachWestResizeEdge() { m_westResizer = new WestResizeEdge(this); super.add(m_westResizer, BorderLayout.WEST); } class EastResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private boolean m_dragging; private JComponent m_resizeComponent; protected EastResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth() + e.getX() >= MIN_WIDTH) m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), m_resizeComponent.getWidth() + e.getX(), m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.E_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; } } class WestResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int m_dragX, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; protected WestResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth()- (e.getX()-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds( m_resizeComponent.getX() + (e.getX()-m_dragX), m_resizeComponent.getY(), m_resizeComponent.getWidth()-(e.getX()-m_dragX), m_resizeComponent.getHeight()); else if (m_resizeComponent.getX() + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.W_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_rightX = m_resizeComponent.getX() + m_resizeComponent.getWidth(); m_dragging = true; m_dragX = e.getX(); } } class NorthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int NORTH = 0; private static final int NORTHEAST = 1; private static final int NORTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX, m_lowerY; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected NorthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.N_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case NORTH: if (h-(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w, MIN_HEIGHT); break; case NORTHEAST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w + (ex-(getWidth()-CORNER)), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; case NORTHWEST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y + (ey-m_dragY), w-(ex-m_dragX), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); } else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), m_lowerY-MIN_HEIGHT, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); m_lowerY = m_resizeComponent.getY() + m_resizeComponent.getHeight(); if (e.getX() < CORNER) { m_mode = NORTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = NORTHEAST; } else { m_mode = NORTH; } } } class SouthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int SOUTH = 0; private static final int SOUTHEAST = 1; private static final int SOUTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected SouthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.S_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case SOUTH: if (h+(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, MIN_HEIGHT); break; case SOUTHEAST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y, MIN_WIDTH, h+(ey-m_dragY)); else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, y, MIN_WIDTH, MIN_HEIGHT); break; case SOUTHWEST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); } else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); if (e.getX() < CORNER) { m_mode = SOUTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = SOUTHEAST; } else { m_mode = SOUTH; } } }
} class MDIPane extends JLayeredPane implements ComponentListener {
public MDIPane() { addComponentListener(this); setOpaque(true); // default background color setBackground(new Color(244,232,152)); } public void componentHidden(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} public void componentShown(ComponentEvent e) {} public void componentResized(ComponentEvent e) { lineup(); } public void lineup() { int frameHeight, frameWidth, currentX, currentY, lheight, lwidth; lwidth = getWidth(); lheight = getHeight(); currentX = 0; currentY = lheight; Component[] components = getComponents(); for (int i=components.length-1; i>-1; i--) { if (components[i] instanceof InnerFrame) { InnerFrame tempFrame = (InnerFrame) components[i]; frameHeight = tempFrame.getHeight(); frameWidth = tempFrame.getWidth(); if (tempFrame.isMaximized()) { tempFrame.setBounds(0,0,getWidth(),getHeight()); tempFrame.validate(); tempFrame.repaint(); } else if (tempFrame.isIconified()) { if (currentX+frameWidth > lwidth) { currentX = 0; currentY -= frameHeight; } tempFrame.setLocation(currentX, currentY-frameHeight); currentX += frameWidth; } } } }
}
</source>
LayeredPane Demo 4: Custom MDI
<source lang="java">
import javax.swing.border.*; import javax.swing.event.*; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class LayeredPaneDemo4 extends JFrame {
public LayeredPaneDemo4() { super("Custom MDI: Part V"); setSize(570,400); getContentPane().setBackground(new Color(244,232,152)); setLayeredPane(new MDIPane()); ImageIcon ii = new ImageIcon("earth.jpg"); 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); frames[i].getContentPane().add( new JScrollPane(new JLabel(ii))); getLayeredPane().add(frames[i]); } WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; Dimension dim = getToolkit().getScreenSize(); setLocation(dim.width/2-getWidth()/2, dim.height/2-getHeight()/2); ImageIcon image = new ImageIcon("spiral.gif"); setIconImage(image.getImage()); addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo4(); }
}
class MDIPane extends JLayeredPane implements ComponentListener {
public MDIPane() { addComponentListener(this); setOpaque(true); // default background color setBackground(new Color(244,232,152)); } public void componentHidden(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} public void componentShown(ComponentEvent e) {} public void componentResized(ComponentEvent e) { lineup(); } public void lineup() { int frameHeight, frameWidth, currentX, currentY, lheight, lwidth; lwidth = getWidth(); lheight = getHeight(); currentX = 0; currentY = lheight; Component[] components = getComponents(); for (int i=components.length-1; i>-1; i--) { if (components[i] instanceof InnerFrame) { InnerFrame tempFrame = (InnerFrame) components[i]; frameHeight = tempFrame.getHeight(); frameWidth = tempFrame.getWidth(); if (tempFrame.isMaximized()) { tempFrame.setBounds(0,0,getWidth(),getHeight()); tempFrame.validate(); tempFrame.repaint(); } else if (tempFrame.isIconified()) { if (currentX+frameWidth > lwidth) { currentX = 0; currentY -= frameHeight; } tempFrame.setLocation(currentX, currentY-frameHeight); currentX += frameWidth; } } } }
} class InnerFrame extends JPanel implements RootPaneContainer, Externalizable {
private static String IMAGE_DIR = "mdi" + java.io.File.separator; private static ImageIcon ICONIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"iconize.gif"); private static ImageIcon RESTORE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"restore.gif"); private static ImageIcon CLOSE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"close.gif"); private static ImageIcon MAXIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"maximize.gif"); private static ImageIcon MINIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"minimize.gif"); private static ImageIcon PRESS_CLOSE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressclose.gif"); 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 ImageIcon PRESS_MAXIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressmaximize.gif"); private static ImageIcon PRESS_MINIMIZE_BUTTON_ICON = new ImageIcon(IMAGE_DIR+"pressminimize.gif"); private static ImageIcon DEFAULT_FRAME_ICON = new ImageIcon(IMAGE_DIR+"default.gif"); private static int BORDER_THICKNESS = 4; private static int WIDTH = 200; private static int HEIGHT = 200; private static int TITLE_BAR_HEIGHT = 25; private static int FRAME_ICON_PADDING = 2; private static int ICONIZED_WIDTH = 150; private static Color DEFAULT_TITLE_BAR_BG_COLOR = new Color(108,190,116); private static Color DEFAULT_BORDER_COLOR = new Color(8,90,16); private static Color DEFAULT_SELECTED_TITLE_BAR_BG_COLOR = new Color(91,182,249); private static Color DEFAULT_SELECTED_BORDER_COLOR = new Color(0,82,149); private Color m_titleBarBackground = DEFAULT_TITLE_BAR_BG_COLOR; private Color m_titleBarForeground = Color.black; private Color m_BorderColor = DEFAULT_BORDER_COLOR; private Color m_selectedTitleBarBackground = DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; private Color m_selectedBorderColor = DEFAULT_SELECTED_BORDER_COLOR; private int m_titleBarHeight = TITLE_BAR_HEIGHT; private int m_width = WIDTH; private int m_height = HEIGHT; private int m_iconizedWidth = ICONIZED_WIDTH; private int m_x; private int m_y; private String m_title; private JLabel m_titleLabel; private JLabel m_iconLabel; private boolean m_iconified; private boolean m_maximized; private boolean m_selected; private boolean m_iconizeable; private boolean m_resizeable; private boolean m_closeable; private boolean m_maximizeable; // only false when maximized private transient boolean m_draggable = true; private transient JRootPane m_rootPane; // used to wrap m_titlePanel and m_rootPane private JPanel m_frameContentPanel; private JPanel m_titlePanel; private JPanel m_contentPanel; private JPanel m_buttonPanel; private JPanel m_buttonWrapperPanel; private InnerFrameButton m_iconize; private InnerFrameButton m_close; private InnerFrameButton m_maximize; private ImageIcon m_frameIcon = DEFAULT_FRAME_ICON; private NorthResizeEdge m_northResizer; private SouthResizeEdge m_southResizer; private EastResizeEdge m_eastResizer; private WestResizeEdge m_westResizer; public InnerFrame() { this(""); } public InnerFrame(String title) { this(title, null); } public InnerFrame(String title, ImageIcon frameIcon) { this(title, frameIcon, true, true, true, true); } public InnerFrame(String title, ImageIcon frameIcon, boolean resizeable, boolean iconizeable, boolean maximizeable, boolean closeable) { super.setLayout(new BorderLayout()); attachNorthResizeEdge(); attachSouthResizeEdge(); attachEastResizeEdge(); attachWestResizeEdge(); populateInnerFrame(); setTitle(title); setResizeable(resizeable); setIconizeable(iconizeable); setCloseable(closeable); setMaximizeable(maximizeable); if (frameIcon != null) setFrameIcon(frameIcon); } protected void populateInnerFrame() { m_rootPane = new JRootPane(); m_frameContentPanel = new JPanel(); m_frameContentPanel.setLayout(new BorderLayout()); createTitleBar(); m_contentPanel = new JPanel(new BorderLayout()); setContentPane(m_contentPanel); m_frameContentPanel.add(m_titlePanel, BorderLayout.NORTH); m_frameContentPanel.add(m_rootPane, BorderLayout.CENTER); setupCapturePanel(); super.add(m_frameContentPanel, BorderLayout.CENTER); } protected void setupCapturePanel() { CapturePanel mouseTrap = new CapturePanel(); m_rootPane.getLayeredPane().add(mouseTrap, new Integer(Integer.MIN_VALUE)); mouseTrap.setBounds(0,0,10000,10000); setGlassPane(new GlassCapturePanel()); getGlassPane().setVisible(true); } // don"t allow this in root pane containers public Component add(Component c) { return null; } // don"t allow this in root pane containers public void setLayout(LayoutManager mgr) { } // make sure layouts don"t make this too small public Dimension getMinimumSize() { return new Dimension(150,100); } // make sure layouts don"t make this too small public Dimension getPreferredSize() { return new Dimension(250,200); } // make sure layouts don"t make this too big // ..doesn"t matter in layered panes because of null layout public Dimension getMaximumSize() { return new Dimension(250,200); } public JMenuBar getJMenuBar() { return m_rootPane.getJMenuBar(); } public JRootPane getRootPane() { return m_rootPane; } public Container getContentPane() { return m_rootPane.getContentPane(); } public Component getGlassPane() { return m_rootPane.getGlassPane(); } public JLayeredPane getLayeredPane() { return m_rootPane.getLayeredPane(); } public void setJMenuBar(JMenuBar menu) { m_rootPane.setJMenuBar(menu); } public void setContentPane(Container content) { m_rootPane.setContentPane(content); } public void setGlassPane(Component glass) { m_rootPane.setGlassPane(glass); } public void setLayeredPane(JLayeredPane layered) { m_rootPane.setLayeredPane(layered); } public void toFront() { if (getParent() instanceof JLayeredPane) ((JLayeredPane) getParent()).moveToFront(this); if (!isSelected()) setSelected(true); } public void close() { if (getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); jlp.remove(InnerFrame.this); jlp.repaint(); } } public boolean isIconizeable() { return m_iconizeable; } public void setIconizeable(boolean b) { m_iconizeable = b; m_iconize.setVisible(b); m_titlePanel.revalidate(); } public boolean isCloseable() { return m_closeable; } public void setCloseable(boolean b) { m_closeable = b; m_close.setVisible(b); m_titlePanel.revalidate(); } public boolean isMaximizeable() { return m_maximizeable; } public void setMaximizeable(boolean b) { m_maximizeable = b; m_maximize.setVisible(b); m_titlePanel.revalidate(); } public boolean isIconified() { return m_iconified; } public void setIconified(boolean b) { m_iconified = b; if (b) { if (isMaximized()) setMaximized(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height setBounds(getX(), getY(), ICONIZED_WIDTH, m_titleBarHeight + 2*BORDER_THICKNESS); m_iconize.setIcon(RESTORE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_RESTORE_BUTTON_ICON); setResizeable(false); } else { toFront(); setBounds(getX(), getY(), m_width, m_height); m_iconize.setIcon(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); setResizeable(true); } revalidate(); } public boolean isMaximized() { return m_maximized; } public void setMaximized(boolean b) { m_maximized = b; if (b) { if (isIconified()) setIconified(false); toFront(); m_width = getWidth(); // remember width m_height = getHeight(); // remember height m_x = getX(); // remember x m_y = getY(); // remember y setBounds(0, 0, getParent().getWidth(), getParent().getHeight()); m_maximize.setIcon(MINIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MINIMIZE_BUTTON_ICON); setResizeable(false); setDraggable(false); } else { toFront(); setBounds(m_x, m_y, m_width, m_height); m_maximize.setIcon(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); setResizeable(true); setDraggable(true); } revalidate(); } public boolean isSelected() { return m_selected; } public void setSelected(boolean b) { if (b) { if (m_selected != true && getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); int layer = jlp.getLayer(this); Component[] components = jlp.getComponentsInLayer(layer); for (int i=0; i<components.length; i++) { if (components[i] instanceof InnerFrame) { InnerFrame tempFrame = (InnerFrame) components[i]; if (!tempFrame.equals(this)) tempFrame.setSelected(false); } } m_selected = true; updateBorderColors(); updateTitleBarColors(); getGlassPane().setVisible(false); repaint(); } } else { m_selected = false; updateBorderColors(); updateTitleBarColors(); getGlassPane().setVisible(true); repaint(); } } //////////////////////////////////////////// //////////////// Title Bar ///////////////// //////////////////////////////////////////// public void setTitleBarBackground(Color c) { m_titleBarBackground = c; updateTitleBarColors(); } public Color getTitleBarBackground() { return m_titleBarBackground; } public void setTitleBarForeground(Color c) { m_titleBarForeground = c; m_titleLabel.setForeground(c); m_titlePanel.repaint(); } public Color getTitleBarForeground() { return m_titleBarForeground; } public void setSelectedTitleBarBackground(Color c) { m_titleBarBackground = c; updateTitleBarColors(); } public Color getSelectedTitleBarBackground() { return m_selectedTitleBarBackground; } protected void updateTitleBarColors() { if (isSelected()) m_titlePanel.setBackground(m_selectedTitleBarBackground); else m_titlePanel.setBackground(m_titleBarBackground); } public void setFrameIcon(ImageIcon fi) { m_frameIcon = fi; if (fi != null) { if (m_frameIcon.getIconHeight() > TITLE_BAR_HEIGHT) setTitleBarHeight(m_frameIcon.getIconHeight() + 2*FRAME_ICON_PADDING); m_iconLabel.setIcon(m_frameIcon); } else setTitleBarHeight(TITLE_BAR_HEIGHT); revalidate(); } public ImageIcon getFrameIcon() { return m_frameIcon; } public void setTitle(String s) { m_title = s; m_titleLabel.setText(s); m_titlePanel.repaint(); } public String getTitle() { return m_title; } public void setTitleBarHeight(int h) { m_titleBarHeight = h; } public int getTitleBarHeight() { return m_titleBarHeight; } public boolean isDraggable() { return m_draggable; } private void setDraggable(boolean b) { m_draggable = b; } // create the title bar: m_titlePanel protected void createTitleBar() { m_titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.this.getWidth(), m_titleBarHeight); } }; m_titlePanel.setLayout(new BorderLayout()); m_titlePanel.setOpaque(true); m_titlePanel.setBackground(m_titleBarBackground); m_titleLabel = new JLabel(); m_titleLabel.setForeground(m_titleBarForeground); m_close = new InnerFrameButton(CLOSE_BUTTON_ICON); m_close.setPressedIcon(PRESS_CLOSE_BUTTON_ICON); m_close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.close(); } }); m_maximize = new InnerFrameButton(MAXIMIZE_BUTTON_ICON); m_maximize.setPressedIcon(PRESS_MAXIMIZE_BUTTON_ICON); m_maximize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setMaximized(!InnerFrame.this.isMaximized()); } }); m_iconize = new InnerFrameButton(ICONIZE_BUTTON_ICON); m_iconize.setPressedIcon(PRESS_ICONIZE_BUTTON_ICON); m_iconize.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { InnerFrame.this.setIconified(!InnerFrame.this.isIconified()); } }); m_buttonWrapperPanel = new JPanel(); m_buttonWrapperPanel.setOpaque(false); m_buttonPanel = new JPanel(new GridLayout(1,3)); m_buttonPanel.setOpaque(false); m_buttonPanel.add(m_iconize); m_buttonPanel.add(m_maximize); m_buttonPanel.add(m_close); m_buttonPanel.setAlignmentX(0.5f); m_buttonPanel.setAlignmentY(0.5f); m_buttonWrapperPanel.add(m_buttonPanel); m_iconLabel = new JLabel(); m_iconLabel.setBorder(new EmptyBorder( FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING, FRAME_ICON_PADDING)); if (m_frameIcon != null) m_iconLabel.setIcon(m_frameIcon); m_titlePanel.add(m_titleLabel, BorderLayout.CENTER); m_titlePanel.add(m_buttonWrapperPanel, BorderLayout.EAST); m_titlePanel.add(m_iconLabel, BorderLayout.WEST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter(this); m_titlePanel.addMouseListener(iftbma); m_titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame m_if; int m_XDifference, m_YDifference; boolean m_dragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { m_if = inf; } // don"t allow dragging outside of parent public void mouseDragged(MouseEvent e) { int ex = e.getX(); int ey = e.getY(); int x = m_if.getX(); int y = m_if.getY(); int w = m_if.getParent().getWidth(); int h = m_if.getParent().getHeight(); if (m_dragging & m_if.isDraggable()) { if ((ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) m_if.setLocation(ex-m_XDifference + x, ey-m_YDifference + y); else if (!(ey + y > 0 && ey + y < h) && (ex + x > 0 && ex + x < w)) { if (!(ey + y > 0) && ey + y < h) m_if.setLocation(ex-m_XDifference + x, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h)) m_if.setLocation(ex-m_XDifference + x, h-m_YDifference); } else if ((ey + y > 0 && ey + y < h) && !(ex + x > 0 && ex + x < w)) { if (!(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, ey-m_YDifference + y); else if (ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, ey-m_YDifference + y); } else if (!(ey + y > 0) && ey + y < h && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, 0-m_YDifference); else if (!(ey + y > 0) && ey + y < h && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, 0-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && !(ex + x > 0) && ex + x < w) m_if.setLocation(0-m_XDifference, h-m_YDifference); else if (ey + y > 0 && !(ey + y < h) && ex + x > 0 && !(ex + x < w)) m_if.setLocation(w-m_XDifference, h-m_YDifference); } } public void mousePressed(MouseEvent e) { m_if.toFront(); m_XDifference = e.getX(); m_YDifference = e.getY(); m_dragging = true; } public void mouseReleased(MouseEvent e) { m_dragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension m_dim; public InnerFrameButton(ImageIcon ii) { super(ii); m_dim = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return m_dim; } public Dimension getMinimumSize() { return m_dim; } public Dimension getMaximumSize() { return m_dim; } } /////////////////////////////////////////////// /////////// Mouse Event Capturing ///////////// /////////////////////////////////////////////// class CapturePanel extends JPanel { public CapturePanel() { MouseInputAdapter mia = new MouseInputAdapter() {}; addMouseListener(mia); addMouseMotionListener(mia); } } /////////////////////////////////////////////// ///////////// GlassPane Selector ////////////// /////////////////////////////////////////////// class GlassCapturePanel extends JPanel { public GlassCapturePanel() { MouseInputAdapter mia = new MouseInputAdapter() { public void mousePressed(MouseEvent e) { InnerFrame.this.toFront(); } }; addMouseListener(mia); addMouseMotionListener(mia); setOpaque(false); } } /////////////////////////////////////////////// //////////////// Resizability ///////////////// /////////////////////////////////////////////// public void setBorderColor(Color c) { m_BorderColor = c; updateBorderColors(); } public Color getBorderColor() { return m_BorderColor; } public void setSelectedBorderColor(Color c) { m_selectedBorderColor = c; updateBorderColors(); } public Color getSelectedBorderColor() { return m_selectedBorderColor; } protected void updateBorderColors() { if (isSelected()) { m_northResizer.setBackground(m_selectedBorderColor); m_southResizer.setBackground(m_selectedBorderColor); m_eastResizer.setBackground(m_selectedBorderColor); m_westResizer.setBackground(m_selectedBorderColor); } else { m_northResizer.setBackground(m_BorderColor); m_southResizer.setBackground(m_BorderColor); m_eastResizer.setBackground(m_BorderColor); m_westResizer.setBackground(m_BorderColor); } } public boolean isResizeable() { return m_resizeable; } public void setResizeable(boolean b) { if (!b && m_resizeable == true) { m_northResizer.removeMouseListener(m_northResizer); m_northResizer.removeMouseMotionListener(m_northResizer); m_southResizer.removeMouseListener(m_southResizer); m_southResizer.removeMouseMotionListener(m_southResizer); m_eastResizer.removeMouseListener(m_eastResizer); m_eastResizer.removeMouseMotionListener(m_eastResizer); m_westResizer.removeMouseListener(m_westResizer); m_westResizer.removeMouseMotionListener(m_westResizer); } else if (b && m_resizeable == false) { m_northResizer.addMouseListener(m_northResizer); m_northResizer.addMouseMotionListener(m_northResizer); m_southResizer.addMouseListener(m_southResizer); m_southResizer.addMouseMotionListener(m_southResizer); m_eastResizer.addMouseListener(m_eastResizer); m_eastResizer.addMouseMotionListener(m_eastResizer); m_westResizer.addMouseListener(m_westResizer); m_westResizer.addMouseMotionListener(m_westResizer); } m_resizeable = b; } protected void attachNorthResizeEdge() { m_northResizer = new NorthResizeEdge(this); super.add(m_northResizer, BorderLayout.NORTH); } protected void attachSouthResizeEdge() { m_southResizer = new SouthResizeEdge(this); super.add(m_southResizer, BorderLayout.SOUTH); } protected void attachEastResizeEdge() { m_eastResizer = new EastResizeEdge(this); super.add(m_eastResizer, BorderLayout.EAST); } protected void attachWestResizeEdge() { m_westResizer = new WestResizeEdge(this); super.add(m_westResizer, BorderLayout.WEST); } class EastResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private boolean m_dragging; private JComponent m_resizeComponent; protected EastResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth() + e.getX() >= MIN_WIDTH) m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), m_resizeComponent.getWidth() + e.getX(), m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.E_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; } } class WestResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private int WIDTH = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int m_dragX, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; protected WestResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(WIDTH, m_resizeComponent.getHeight()); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { if (m_resizeComponent.getWidth()- (e.getX()-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds( m_resizeComponent.getX() + (e.getX()-m_dragX), m_resizeComponent.getY(), m_resizeComponent.getWidth()-(e.getX()-m_dragX), m_resizeComponent.getHeight()); else if (m_resizeComponent.getX() + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); else m_resizeComponent.setBounds(m_resizeComponent.getX(), m_resizeComponent.getY(), MIN_WIDTH, m_resizeComponent.getHeight()); m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.W_RESIZE_CURSOR)); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_rightX = m_resizeComponent.getX() + m_resizeComponent.getWidth(); m_dragging = true; m_dragX = e.getX(); } } class NorthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int NORTH = 0; private static final int NORTHEAST = 1; private static final int NORTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX, m_lowerY; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected NorthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.NE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.N_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case NORTH: if (h-(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w, MIN_HEIGHT); break; case NORTHEAST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y + (ey-m_dragY), w + (ex-(getWidth()-CORNER)), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; case NORTHWEST: if (h-(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y + (ey-m_dragY), w-(ex-m_dragX), h-(ey-m_dragY)); else if (h-(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y + (ey-m_dragY), MIN_WIDTH, h-(ey-m_dragY)); else m_resizeComponent.setBounds(x, y + (ey-m_dragY), w, h-(ey-m_dragY)); } else if (!(h-(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), m_lowerY-MIN_HEIGHT, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, m_lowerY-MIN_HEIGHT, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); m_lowerY = m_resizeComponent.getY() + m_resizeComponent.getHeight(); if (e.getX() < CORNER) { m_mode = NORTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = NORTHEAST; } else { m_mode = NORTH; } } } class SouthResizeEdge extends JPanel implements MouseListener, MouseMotionListener { private static final int SOUTH = 0; private static final int SOUTHEAST = 1; private static final int SOUTHWEST = 2; private int CORNER = 10; private int HEIGHT = BORDER_THICKNESS; private int MIN_WIDTH = ICONIZED_WIDTH; private int MIN_HEIGHT = TITLE_BAR_HEIGHT+(2*HEIGHT); private int m_width, m_dragX, m_dragY, m_rightX; private boolean m_dragging; private JComponent m_resizeComponent; private int m_mode; protected SouthResizeEdge(JComponent c) { m_resizeComponent = c; setOpaque(true); setBackground(m_BorderColor); } public Dimension getPreferredSize() { return new Dimension(m_resizeComponent.getWidth(), HEIGHT); } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) { if (!m_dragging) { if (e.getX() < CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SW_RESIZE_CURSOR)); } else if(e.getX() > getWidth()-CORNER) { setCursor(Cursor.getPredefinedCursor( Cursor.SE_RESIZE_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor( Cursor.S_RESIZE_CURSOR)); } } } public void mouseReleased(MouseEvent e) { m_dragging = false; } public void mouseDragged(MouseEvent e) { int h = m_resizeComponent.getHeight(); int w = m_resizeComponent.getWidth(); int x = m_resizeComponent.getX(); int y = m_resizeComponent.getY(); int ex = e.getX(); int ey = e.getY(); switch (m_mode) { case SOUTH: if (h+(ey-m_dragY) >= MIN_HEIGHT) m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, MIN_HEIGHT); break; case SOUTHEAST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH)) m_resizeComponent.setBounds(x, y, MIN_WIDTH, h+(ey-m_dragY)); else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w + (ex-(getWidth()-CORNER)) >= MIN_WIDTH) m_resizeComponent.setBounds(x, y, w + (ex-(getWidth()-CORNER)), MIN_HEIGHT); else m_resizeComponent.setBounds(x, y, MIN_WIDTH, MIN_HEIGHT); break; case SOUTHWEST: if (h+(ey-m_dragY) >= MIN_HEIGHT && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), h+(ey-m_dragY)); else if (h+(ey-m_dragY) >= MIN_HEIGHT && !(w-(ex-m_dragX) >= MIN_WIDTH)) { if (x + MIN_WIDTH < m_rightX) m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, h+(ey-m_dragY)); else m_resizeComponent.setBounds(x, y, w, h+(ey-m_dragY)); } else if (!(h+(ey-m_dragY) >= MIN_HEIGHT) && w-(ex-m_dragX) >= MIN_WIDTH) m_resizeComponent.setBounds(x + (ex-m_dragX), y, w-(ex-m_dragX), MIN_HEIGHT); else m_resizeComponent.setBounds(m_rightX-MIN_WIDTH, y, MIN_WIDTH, MIN_HEIGHT); break; } m_rightX = x + w; m_resizeComponent.validate(); } public void mouseEntered(MouseEvent e) { mouseMoved(e); } public void mouseExited(MouseEvent e) { if (!m_dragging) setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } public void mousePressed(MouseEvent e) { toFront(); m_dragging = true; m_dragX = e.getX(); m_dragY = e.getY(); if (e.getX() < CORNER) { m_mode = SOUTHWEST; } else if(e.getX() > getWidth()-CORNER) { m_mode = SOUTHEAST; } else { m_mode = SOUTH; } } } /////////////////////////////////////////////// /////////////// Serialization ///////////////// /////////////////////////////////////////////// public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(m_titleBarBackground); out.writeObject(m_titleBarForeground); out.writeObject(m_BorderColor); out.writeObject(m_selectedTitleBarBackground); out.writeObject(m_selectedBorderColor); out.writeObject(m_title); out.writeBoolean(m_iconizeable); out.writeBoolean(m_resizeable); out.writeBoolean(m_closeable); out.writeBoolean(m_maximizeable); out.writeObject(m_frameIcon); out.writeObject(getBounds()); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { setTitleBarBackground((Color)in.readObject()); setTitleBarForeground((Color)in.readObject()); setBorderColor((Color)in.readObject()); setSelectedTitleBarBackground((Color)in.readObject()); setSelectedBorderColor((Color)in.readObject()); setTitle((String)in.readObject()); setIconizeable(in.readBoolean()); setResizeable(in.readBoolean()); setCloseable(in.readBoolean()); setMaximizeable(in.readBoolean()); setSelected(false); setFrameIcon((ImageIcon)in.readObject()); Rectangle r = (Rectangle)in.readObject(); r.x = getX(); r.y = getY(); setBounds(r.x,r.x,r.width,r.height); }
}
</source>
Layered Panel demo 2
<source lang="java">
import java.awt.Color; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JButton; import javax.swing.JFrame; public class LayeredPaneDemo extends JFrame {
public LayeredPaneDemo() { super(""); setSize(570, 400); getContentPane().setBackground(new Color(244, 232, 152)); getLayeredPane().setOpaque(true); JButton[] frames = new JButton[5]; for (int i = 0; i < 5; i++) { frames[i] = new JButton("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(); }
}
</source>