Java/Swing JFC/MDI
Содержание
Build multiple document interface by yourself
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Hashtable; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.LookAndFeel; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.MatteBorder; import javax.swing.event.MouseInputAdapter; import javax.swing.plaf.BorderUIResource; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ruponentUI; import javax.swing.plaf.FontUIResource; public class LayeredPaneDemo extends JFrame {
public LayeredPaneDemo() { super(""); setSize(570, 400); getContentPane().setBackground(new Color(244, 232, 152)); getLayeredPane().setOpaque(true); InnerFrame[] frames = new InnerFrame[5]; for (int i = 0; i < 5; i++) { frames[i] = new InnerFrame("InnerFrame " + i); frames[i].setBounds(50 + i * 20, 50 + i * 20, 200, 200); getLayeredPane().add(frames[i]); } WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(l); setVisible(true); } public static void main(String[] args) { new LayeredPaneDemo(); }
} class InnerFrame extends JPanel {
private static String IMAGE_DIR = "mdi" + java.io.File.separator; private static ImageIcon PRESS_RESTORE_BUTTON_ICON = new ImageIcon( IMAGE_DIR + "pressrestore.gif"); private static ImageIcon PRESS_ICONIZE_BUTTON_ICON = new ImageIcon( IMAGE_DIR + "pressiconize.gif"); private static final int WIDTH = 200; private static final int HEIGHT = 200; private static final int TITLE_BAR_HEIGHT = 25; private static Color TITLE_BAR_BG_COLOR = new Color(108, 190, 116); private String title; private JLabel titleLabel; private boolean isIconified; private JPanel titlePanel; private JPanel contentPanel; private JPanel buttonPanel; private JPanel buttonWrapperPanel; private InnerFrameButton iconizeButton; private InnerFrameButton closeButton; public InnerFrame(String t) { title = t; setLayout(new BorderLayout()); createTitleBar(); contentPanel = new JPanel(); add(titlePanel, BorderLayout.NORTH); add(contentPanel, BorderLayout.CENTER); } public void toFront() { if (getParent() instanceof JLayeredPane) ((JLayeredPane) getParent()).moveToFront(this); } public void close() { if (getParent() instanceof JLayeredPane) { JLayeredPane jlp = (JLayeredPane) getParent(); jlp.remove(InnerFrame.this); jlp.repaint(); } } public void setIconified(boolean b) { isIconified = b; if (b) { setBounds(getX(), getY(), WIDTH, TITLE_BAR_HEIGHT); } else { setBounds(getX(), getY(), WIDTH, HEIGHT); revalidate(); } } public boolean isIconified() { return isIconified; } // Title Bar public void createTitleBar() { titlePanel = new JPanel() { public Dimension getPreferredSize() { return new Dimension(InnerFrame.WIDTH, InnerFrame.TITLE_BAR_HEIGHT); } }; titlePanel.setLayout(new BorderLayout()); titlePanel.setOpaque(true); titlePanel.setBackground(TITLE_BAR_BG_COLOR); titleLabel = new JLabel(title); titleLabel.setForeground(Color.black); buttonWrapperPanel = new JPanel(); buttonWrapperPanel.setOpaque(false); buttonPanel = new JPanel(new GridLayout(1, 2)); buttonPanel.setOpaque(false); buttonPanel.setAlignmentX(0.5f); buttonPanel.setAlignmentY(0.5f); buttonWrapperPanel.add(buttonPanel); titlePanel.add(titleLabel, BorderLayout.CENTER); titlePanel.add(buttonWrapperPanel, BorderLayout.EAST); InnerFrameTitleBarMouseAdapter iftbma = new InnerFrameTitleBarMouseAdapter( this); titlePanel.addMouseListener(iftbma); titlePanel.addMouseMotionListener(iftbma); } // title bar mouse adapter for frame dragging class InnerFrameTitleBarMouseAdapter extends MouseInputAdapter { InnerFrame innerFrame; int xDifference, yDifference; boolean isDragging; public InnerFrameTitleBarMouseAdapter(InnerFrame inf) { innerFrame = inf; } public void mouseDragged(MouseEvent e) { if (isDragging) innerFrame.setLocation(e.getX() - xDifference + getX(), e.getY() - yDifference + getY()); } public void mousePressed(MouseEvent e) { innerFrame.toFront(); xDifference = e.getX(); yDifference = e.getY(); isDragging = true; } public void mouseReleased(MouseEvent e) { isDragging = false; } } // custom button class for title bar class InnerFrameButton extends JButton { Dimension size; public InnerFrameButton(ImageIcon ii) { super(ii); size = new Dimension(ii.getIconWidth(), ii.getIconHeight()); setOpaque(false); setContentAreaFilled(false); setBorder(null); } public Dimension getPreferredSize() { return size; } public Dimension getMinimumSize() { return size; } public Dimension getMaximumSize() { return size; } }
} class InnerFrameUI extends javax.swing.plaf.PanelUI {
private static InnerFrameUI frameUI; protected static Color DEFAULT_TITLE_BAR_BG_COLOR; protected static Color DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; protected static Color DEFAULT_TITLE_BAR_FG_COLOR; protected static Color DEFAULT_SELECTED_TITLE_BAR_FG_COLOR; protected static Font DEFAULT_TITLE_BAR_FONT; protected static Border DEFAULT_INNER_FRAME_BORDER; protected static Icon DEFAULT_FRAME_ICON; private static Hashtable myDefaults = new Hashtable(); static { myDefaults.put("InternalFrame.inactiveTitleBackground", new ColorUIResource(108, 190, 116)); myDefaults.put("InternalFrame.inactiveTitleForeground", new ColorUIResource(Color.black)); myDefaults.put("InternalFrame.activeTitleBackground", new ColorUIResource(91, 182, 249)); myDefaults.put("InternalFrame.activeTitleForeground", new ColorUIResource(Color.black)); myDefaults.put("InternalFrame.titleFont", new FontUIResource( "Dialog", Font.BOLD, 12)); myDefaults.put("InternalFrame.border", new BorderUIResource( new MatteBorder(4, 4, 4, 4, Color.blue))); } public static ComponentUI createUI(JComponent c) { LookAndFeel currentLF = UIManager.getLookAndFeel(); if (frameUI == null) frameUI = new InnerFrameUI(); try { frameUI.installDefaults(); InnerFrame frame = (InnerFrame) c; frame.setBorder(DEFAULT_INNER_FRAME_BORDER); if (frame.isShowing()) frame.repaint(); } catch (Exception ex) { System.err.println(ex); ex.printStackTrace(); } return frameUI; } public void installUI(JComponent c) { InnerFrame frame = (InnerFrame) c; super.installUI(frame); } public void uninstallUI(JComponent c) { super.uninstallUI(c); } protected void installDefaults() { DEFAULT_TITLE_BAR_BG_COLOR = (Color) findDefaultResource("InternalFrame.inactiveTitleBackground"); DEFAULT_TITLE_BAR_FG_COLOR = (Color) findDefaultResource("InternalFrame.inactiveTitleForeground"); DEFAULT_SELECTED_TITLE_BAR_BG_COLOR = (Color) findDefaultResource("InternalFrame.activeTitleBackground"); DEFAULT_SELECTED_TITLE_BAR_FG_COLOR = (Color) findDefaultResource("InternalFrame.activeTitleForeground"); DEFAULT_TITLE_BAR_FONT = (Font) findDefaultResource("InternalFrame.titleFont"); DEFAULT_INNER_FRAME_BORDER = (Border) findDefaultResource("InternalFrame.border"); DEFAULT_FRAME_ICON = (Icon) findDefaultResource("InternalFrame.icon"); } protected Object findDefaultResource(String id) { Object obj = null; try { UIDefaults uiDef = UIManager.getDefaults(); obj = uiDef.get(id); } catch (Exception ex) { System.err.println(ex); } if (obj == null) obj = myDefaults.get(id); return obj; } public void paint(Graphics g, JComponent c) { super.paint(g, c); if (c.getBorder() != null) c.getBorder().paintBorder(c, g, 0, 0, c.getWidth(), c.getHeight()); } public Color getTitleBarBkColor() { return DEFAULT_TITLE_BAR_BG_COLOR; } public Color getSelectedTitleBarBkColor() { return DEFAULT_SELECTED_TITLE_BAR_BG_COLOR; } public Color getTitleBarFgColor() { return DEFAULT_TITLE_BAR_FG_COLOR; } public Color getSelectedTitleBarFgColor() { return DEFAULT_SELECTED_TITLE_BAR_FG_COLOR; } public Font getTitleBarFont() { return DEFAULT_TITLE_BAR_FONT; } public Border getInnerFrameBorder() { return DEFAULT_INNER_FRAME_BORDER; }
}
</source>
Create a virtual desktop in your application
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class Main extends JFrame {
public Main() { JMenuBar bar = new JMenuBar(); JMenu addMenu = new JMenu("Add"); JMenuItem newFrame = new JMenuItem("Internal Frame"); addMenu.add(newFrame); bar.add(addMenu); setJMenuBar(bar); final JDesktopPane theDesktop = new JDesktopPane(); getContentPane().add(theDesktop); newFrame.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JInternalFrame frame = new JInternalFrame("Internal Frame", true, true, true, true); Container c = frame.getContentPane(); MyJPanel panel = new MyJPanel(); c.add(panel, BorderLayout.CENTER); frame.setSize(200,200); frame.setOpaque(true); theDesktop.add(frame); } }); setSize(500, 400); setVisible(true); } public static void main(String args[]) { Main app = new Main(); }
} class MyJPanel extends JPanel {
public MyJPanel() { add(new JLabel("adf")); }
}
</source>
Creating a JDesktopPane Container
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JTextArea; public class Main {
public static void main(String[] argv) throws Exception { boolean resizable = true; boolean closeable = true; boolean maximizable = true; boolean iconifiable = true; String title = "Frame Title"; JInternalFrame iframe = new JInternalFrame(title, resizable, closeable, maximizable, iconifiable); iframe.setSize(300, 300); iframe.setVisible(true); iframe.getContentPane().add(new JTextArea()); JDesktopPane desktop = new JDesktopPane(); desktop.add(iframe); JFrame frame = new JFrame(); frame.getContentPane().add(desktop, BorderLayout.CENTER); frame.setSize(300, 300); frame.setVisible(true); }
}
</source>
<source lang="java">
// This is example is from Kjell Dirdal. // Referenced from http://www.javaworld.ru/javaworld/jw-05-2001/jw-0525-mdi.html
import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.Dimension; import java.awt.Insets; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyVetoException; import javax.swing.DefaultDesktopManager; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JViewport; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; public class KjellDirdalNotepad extends JFrame {
private MDIDesktopPane desktop = new MDIDesktopPane(); private JMenuBar menuBar = new JMenuBar(); private JMenu fileMenu = new JMenu("File"); private JMenuItem newMenu = new JMenuItem("New"); private JScrollPane scrollPane = new JScrollPane(); public KjellDirdalNotepad() { menuBar.add(fileMenu); menuBar.add(new WindowMenu(desktop)); fileMenu.add(newMenu); setJMenuBar(menuBar); setTitle("MDI Test"); scrollPane.getViewport().add(desktop); getContentPane().setLayout(new BorderLayout()); getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); newMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { desktop.add(new TextFrame()); } }); } public static void main(String[] args) { KjellDirdalNotepad notepad = new KjellDirdalNotepad(); notepad.setSize(600, 400); notepad.setVisible(true); }
} class TextFrame extends JInternalFrame {
private JTextArea textArea = new JTextArea(); private JScrollPane scrollPane = new JScrollPane(); public TextFrame() { setSize(200, 300); setTitle("Edit Text"); setMaximizable(true); setIconifiable(true); setClosable(true); setResizable(true); scrollPane.getViewport().add(textArea); getContentPane().setLayout(new BorderLayout()); getContentPane().add(scrollPane, BorderLayout.CENTER); }
} /**
* An extension of WDesktopPane that supports often used MDI functionality. This * class also handles setting scroll bars for when windows move too far to the * left or bottom, providing the MDIDesktopPane is in a ScrollPane. */
class MDIDesktopPane extends JDesktopPane {
private static int FRAME_OFFSET = 20; private MDIDesktopManager manager; public MDIDesktopPane() { manager = new MDIDesktopManager(this); setDesktopManager(manager); setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); } public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); checkDesktopSize(); } public Component add(JInternalFrame frame) { JInternalFrame[] array = getAllFrames(); Point p; int w; int h; Component retval = super.add(frame); checkDesktopSize(); if (array.length > 0) { p = array[0].getLocation(); p.x = p.x + FRAME_OFFSET; p.y = p.y + FRAME_OFFSET; } else { p = new Point(0, 0); } frame.setLocation(p.x, p.y); if (frame.isResizable()) { w = getWidth() - (getWidth() / 3); h = getHeight() - (getHeight() / 3); if (w < frame.getMinimumSize().getWidth()) w = (int) frame.getMinimumSize().getWidth(); if (h < frame.getMinimumSize().getHeight()) h = (int) frame.getMinimumSize().getHeight(); frame.setSize(w, h); } moveToFront(frame); frame.setVisible(true); try { frame.setSelected(true); } catch (PropertyVetoException e) { frame.toBack(); } return retval; } public void remove(Component c) { super.remove(c); checkDesktopSize(); } /** * Cascade all internal frames */ public void cascadeFrames() { int x = 0; int y = 0; JInternalFrame allFrames[] = getAllFrames(); manager.setNormalSize(); int frameHeight = (getBounds().height - 5) - allFrames.length * FRAME_OFFSET; int frameWidth = (getBounds().width - 5) - allFrames.length * FRAME_OFFSET; for (int i = allFrames.length - 1; i >= 0; i--) { allFrames[i].setSize(frameWidth, frameHeight); allFrames[i].setLocation(x, y); x = x + FRAME_OFFSET; y = y + FRAME_OFFSET; } } /** * Tile all internal frames */ public void tileFrames() { java.awt.ruponent allFrames[] = getAllFrames(); manager.setNormalSize(); int frameHeight = getBounds().height / allFrames.length; int y = 0; for (int i = 0; i < allFrames.length; i++) { allFrames[i].setSize(getBounds().width, frameHeight); allFrames[i].setLocation(0, y); y = y + frameHeight; } } /** * Sets all component size properties ( maximum, minimum, preferred) to the * given dimension. */ public void setAllSize(Dimension d) { setMinimumSize(d); setMaximumSize(d); setPreferredSize(d); } /** * Sets all component size properties ( maximum, minimum, preferred) to the * given width and height. */ public void setAllSize(int width, int height) { setAllSize(new Dimension(width, height)); } private void checkDesktopSize() { if (getParent() != null && isVisible()) manager.resizeDesktop(); }
} /**
* Private class used to replace the standard DesktopManager for JDesktopPane. * Used to provide scrollbar functionality. */
class MDIDesktopManager extends DefaultDesktopManager {
private MDIDesktopPane desktop; public MDIDesktopManager(MDIDesktopPane desktop) { this.desktop = desktop; } public void endResizingFrame(JComponent f) { super.endResizingFrame(f); resizeDesktop(); } public void endDraggingFrame(JComponent f) { super.endDraggingFrame(f); resizeDesktop(); } public void setNormalSize() { JScrollPane scrollPane = getScrollPane(); int x = 0; int y = 0; Insets scrollInsets = getScrollPaneInsets(); if (scrollPane != null) { Dimension d = scrollPane.getVisibleRect().getSize(); if (scrollPane.getBorder() != null) { d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right, d.getHeight() - scrollInsets.top - scrollInsets.bottom); } d.setSize(d.getWidth() - 20, d.getHeight() - 20); desktop.setAllSize(x, y); scrollPane.invalidate(); scrollPane.validate(); } } private Insets getScrollPaneInsets() { JScrollPane scrollPane = getScrollPane(); if (scrollPane == null) return new Insets(0, 0, 0, 0); else return getScrollPane().getBorder().getBorderInsets(scrollPane); } private JScrollPane getScrollPane() { if (desktop.getParent() instanceof JViewport) { JViewport viewPort = (JViewport) desktop.getParent(); if (viewPort.getParent() instanceof JScrollPane) return (JScrollPane) viewPort.getParent(); } return null; } protected void resizeDesktop() { int x = 0; int y = 0; JScrollPane scrollPane = getScrollPane(); Insets scrollInsets = getScrollPaneInsets(); if (scrollPane != null) { JInternalFrame allFrames[] = desktop.getAllFrames(); for (int i = 0; i < allFrames.length; i++) { if (allFrames[i].getX() + allFrames[i].getWidth() > x) { x = allFrames[i].getX() + allFrames[i].getWidth(); } if (allFrames[i].getY() + allFrames[i].getHeight() > y) { y = allFrames[i].getY() + allFrames[i].getHeight(); } } Dimension d = scrollPane.getVisibleRect().getSize(); if (scrollPane.getBorder() != null) { d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right, d.getHeight() - scrollInsets.top - scrollInsets.bottom); } if (x <= d.getWidth()) x = ((int) d.getWidth()) - 20; if (y <= d.getHeight()) y = ((int) d.getHeight()) - 20; desktop.setAllSize(x, y); scrollPane.invalidate(); scrollPane.validate(); } }
} /**
* Menu component that handles the functionality expected of a standard * "Windows" menu for MDI applications. */
class WindowMenu extends JMenu {
private MDIDesktopPane desktop; private JMenuItem cascade = new JMenuItem("Cascade"); private JMenuItem tile = new JMenuItem("Tile"); public WindowMenu(MDIDesktopPane desktop) { this.desktop = desktop; setText("Window"); cascade.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { WindowMenu.this.desktop.cascadeFrames(); } }); tile.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { WindowMenu.this.desktop.tileFrames(); } }); addMenuListener(new MenuListener() { public void menuCanceled(MenuEvent e) { } public void menuDeselected(MenuEvent e) { removeAll(); } public void menuSelected(MenuEvent e) { buildChildMenus(); } }); } /* Sets up the children menus depending on the current desktop state */ private void buildChildMenus() { int i; ChildMenuItem menu; JInternalFrame[] array = desktop.getAllFrames(); add(cascade); add(tile); if (array.length > 0) addSeparator(); cascade.setEnabled(array.length > 0); tile.setEnabled(array.length > 0); for (i = 0; i < array.length; i++) { menu = new ChildMenuItem(array[i]); menu.setState(i == 0); menu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { JInternalFrame frame = ((ChildMenuItem) ae.getSource()).getFrame(); frame.moveToFront(); try { frame.setSelected(true); } catch (PropertyVetoException e) { e.printStackTrace(); } } }); menu.setIcon(array[i].getFrameIcon()); add(menu); } } /* * This JCheckBoxMenuItem descendant is used to track the child frame that * corresponds to a give menu. */ class ChildMenuItem extends JCheckBoxMenuItem { private JInternalFrame frame; public ChildMenuItem(JInternalFrame frame) { super(frame.getTitle()); this.frame = frame; } public JInternalFrame getFrame() { return frame; } }
}
</source>
Getting All Frames in a JDesktopPane Container
<source lang="java">
import javax.swing.JDesktopPane; import javax.swing.JInternalFrame; public class Main {
public static void main(String[] argv) throws Exception { JDesktopPane desktop = new JDesktopPane(); JInternalFrame[] frames = desktop.getAllFrames(); for (int i = 0; i < frames.length; i++) { String title = frames[i].getTitle(); boolean isVisible = frames[i].isVisible(); boolean isCloseable = frames[i].isClosable(); boolean isResizeable = frames[i].isResizable(); boolean isIconifiable = frames[i].isIconifiable(); boolean isIcon = frames[i].isIcon(); boolean isMaximizable = frames[i].isMaximizable(); boolean isSelected = frames[i].isSelected(); } }
}
</source>