📄 innerframe.java
字号:
/**
* Copyright 1999-2002 Matthew Robinson and Pavel Vorobiev.
* All Rights Reserved.
*
* ===================================================
* This program contains code from the book "Swing"
* 2nd Edition by Matthew Robinson and Pavel Vorobiev
* http://www.spindoczine.com/sbe
* ===================================================
*
* The above paragraph must be included in full, unmodified
* and completely intact in the beginning of any source code
* file that references, copies or uses (in any way, shape
* or form) code contained in this file.
*/
package mdi;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.EmptyBorder;
public 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() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -