📄 defaultdesktopmanager.java
字号:
*/ public void deactivateFrame(JInternalFrame frame) { JDesktopPane p = frame.getDesktopPane(); if (p != null) { if (p.getSelectedFrame() == frame) p.setSelectedFrame(null); } else { try { frame.setSelected(false); } catch (PropertyVetoException e) { // Do nothing if attempt is vetoed. } } } /** * This method is called to indicate that the DesktopManager should prepare * to drag the JInternalFrame. Any state information needed to drag the * frame will be prepared now. * * @param component The JComponent to drag, usually a JInternalFrame. */ public void beginDraggingFrame(JComponent component) { if (component instanceof JDesktopIcon) pane = ((JDesktopIcon) component).getInternalFrame().getDesktopPane(); else pane = ((JInternalFrame) component).getDesktopPane(); if (pane == null) return; dragCache = component.getBounds(); if (! (pane instanceof JDesktopPane)) currentDragMode = JDesktopPane.LIVE_DRAG_MODE; else currentDragMode = ((JDesktopPane) pane).getDragMode(); } /** * This method is called to drag the JInternalFrame to a new location. * * @param component The JComponent to drag, usually a JInternalFrame. * * @param newX The new x coordinate. * @param newY The new y coordinate. */ public void dragFrame(JComponent component, int newX, int newY) { if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) { // FIXME: Do outline drag mode painting. } else { Rectangle b = component.getBounds(); if (component instanceof JDesktopIcon) component.setBounds(newX, newY, b.width, b.height); else setBoundsForFrame((JInternalFrame) component, newX, newY, b.width, b.height); } } /** * This method indicates that the dragging is done. Any state information * stored by the DesktopManager can be cleared. * * @param component The JComponent that has finished dragging. */ public void endDraggingFrame(JComponent component) { if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) { setBoundsForFrame((JInternalFrame) component, dragCache.x, dragCache.y, dragCache.width, dragCache.height); pane = null; dragCache = null; } component.repaint(); } /** * This method is called to indicate that the given JComponent will be * resized. Any state information necessary to resize the JComponent will * be prepared now. * * @param component The JComponent to resize, usually a JInternalFrame. * @param direction The direction to drag in (a SwingConstant). */ public void beginResizingFrame(JComponent component, int direction) { pane = ((JInternalFrame) component).getDesktopPane(); if (pane == null) return; dragCache = component.getBounds(); if (! (pane instanceof JDesktopPane)) currentDragMode = JDesktopPane.LIVE_DRAG_MODE; else currentDragMode = ((JDesktopPane) pane).getDragMode(); } /** * This method resizes the give JComponent. * * @param component The JComponent to resize. * @param newX The new x coordinate. * @param newY The new y coordinate. * @param newWidth The new width. * @param newHeight The new height. */ public void resizeFrame(JComponent component, int newX, int newY, int newWidth, int newHeight) { dragCache.setBounds(newX, newY, newWidth, newHeight); if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) { // FIXME: Do outline drag painting. } else setBoundsForFrame(component, dragCache.x, dragCache.y, dragCache.width, dragCache.height); } /** * This method is called to indicate that the given JComponent has finished * dragging. Any state information stored by the DesktopManager can be * cleared. * * @param component The JComponent that finished resizing. */ public void endResizingFrame(JComponent component) { if (currentDragMode == JDesktopPane.OUTLINE_DRAG_MODE) { setBoundsForFrame((JInternalFrame) component, dragCache.x, dragCache.y, dragCache.width, dragCache.height); pane = null; dragCache = null; } component.repaint(); } /** * This method calls setBounds with the given parameters and repaints the * JComponent. * * @param component The JComponent to set bounds for. * @param newX The new x coordinate. * @param newY The new y coordinate. * @param newWidth The new width. * @param newHeight The new height. */ public void setBoundsForFrame(JComponent component, int newX, int newY, int newWidth, int newHeight) { component.setBounds(newX, newY, newWidth, newHeight); component.revalidate(); // If not null, I'd rather repaint the parent if (component.getParent() != null) component.getParent().repaint(); else component.repaint(); } /** * This is a helper method that removes the JDesktopIcon of the given * JInternalFrame from the parent. * * @param frame The JInternalFrame to remove an icon for. */ protected void removeIconFor(JInternalFrame frame) { JDesktopIcon icon = frame.getDesktopIcon(); Container c = icon.getParent(); if (c != null && icon != null) c.remove(icon); } /** * This method is called by iconifyFrame to determine the bounds of the * JDesktopIcon for the given JInternalFrame. * * @param frame The JInternalFrame to find the bounds of its JDesktopIcon * for. * * @return The bounds of the JDesktopIcon. */ protected Rectangle getBoundsForIconOf(JInternalFrame frame) { // IconRects has no order to it. // The icon _must_ be placed in the first free slot (working from // the bottom left corner) // The icon also must not be placed where another icon is placed // (regardless whether that frame is an icon currently or not) JDesktopPane desktopPane = frame.getDesktopPane(); if (desktopPane == null) return frame.getDesktopIcon().getBounds(); Rectangle paneBounds = desktopPane.getBounds(); Insets insets = desktopPane.getInsets(); Dimension pref = frame.getDesktopIcon().getPreferredSize(); Component[] frames = desktopPane.getComponents(); int count = 0; for (int i = 0, j = 0; i < frames.length; i++) if (frames[i] instanceof JDesktopIcon || frames[i] instanceof JInternalFrame && ((JInternalFrame) frames[i]).getWasIcon() && frames[i] != frame) count++; iconRects = new Rectangle[count]; for (int i = 0, j = 0; i < frames.length; i++) if (frames[i] instanceof JDesktopIcon) iconRects[--count] = frames[i].getBounds(); else if (frames[i] instanceof JInternalFrame && ((JInternalFrame) frames[i]).getWasIcon() && frames[i] != frame) iconRects[--count] = ((JInternalFrame) frames[i]) .getDesktopIcon().getBounds(); int startingX = insets.left; int startingY = paneBounds.height - insets.bottom - pref.height; Rectangle ideal = new Rectangle(startingX, startingY, pref.width, pref.height); boolean clear = true; while (iconRects.length > 0) { clear = true; for (int i = 0; i < iconRects.length; i++) { if (iconRects[i] != null && iconRects[i].intersects(ideal)) { clear = false; break; } } if (clear) return ideal; startingX += pref.width; if (startingX + pref.width > paneBounds.width - insets.right) { startingX = insets.left; startingY -= pref.height; } ideal.setBounds(startingX, startingY, pref.width, pref.height); } return ideal; } /** * This method sets the bounds of the JInternalFrame right before the * maximizeFrame call. * * @param frame The JInternalFrame being maximized. * @param rect The normal bounds. */ protected void setPreviousBounds(JInternalFrame frame, Rectangle rect) { frame.setNormalBounds(rect); } /** * This method returns the normal bounds of the JInternalFrame from before * the maximize call. * * @param frame The JInternalFrame that is being restored. * * @return The previous bounds of the JInternalFrame. */ protected Rectangle getPreviousBounds(JInternalFrame frame) { return frame.getNormalBounds(); } /** * This method sets the value to true if the given JInternalFrame has been * iconized and the bounds of its DesktopIcon are valid. * * @param frame The JInternalFrame for the JDesktopIcon. * @param value True if the JInternalFrame has been iconized and the bounds * of the JDesktopIcon are valid. */ protected void setWasIcon(JInternalFrame frame, Boolean value) { frame.setWasIcon(value.booleanValue(), WAS_ICON_ONCE_PROPERTY); } /** * This method returns true if the given JInternalFrame has been iconized * and the bounds of its DesktopIcon are valid. * * @param frame The JInternalFrame for the JDesktopIcon. * * @return True if the given JInternalFrame has been iconized and the bounds * of its DesktopIcon are valid. */ protected boolean wasIcon(JInternalFrame frame) { return frame.getWasIcon(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -