repaintmanager.java
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· Java 代码 · 共 543 行 · 第 1/2 页
JAVA
543 行
{ repaintWorker.setLive(true); SwingUtilities.invokeLater(repaintWorker); } } /** * Remove a component from the {@link #invalidComponents} vector. * * @param component The component to remove * * @see #addInvalidComponent */ public synchronized void removeInvalidComponent(JComponent component) { invalidComponents.removeElement(component); } /** * Add a region to the set of dirty regions for a specified component. * This involves union'ing the new region with any existing dirty region * associated with the component. If the {@link #repaintWorker} class * is not active, insert it in the system event queue. * * @param component The component to add a dirty region for * @param x The left x coordinate of the new dirty region * @param y The top y coordinate of the new dirty region * @param w The width of the new dirty region * @param h The height of the new dirty region * * @see #addDirtyRegion * @see #getDirtyRegion * @see #isCompletelyDirty * @see #markCompletelyClean * @see #markCompletelyDirty */ public synchronized void addDirtyRegion(JComponent component, int x, int y, int w, int h) { if (w == 0 || h == 0) return; Rectangle r = new Rectangle(x, y, w, h); if (dirtyComponents.containsKey(component)) r = r.union((Rectangle)dirtyComponents.get(component)); dirtyComponents.put(component, r); if (! repaintWorker.isLive()) { repaintWorker.setLive(true); SwingUtilities.invokeLater(repaintWorker); } } /** * Get the dirty region associated with a component, or <code>null</code> * if the component has no dirty region. * * @param component The component to get the dirty region of * * @return The dirty region of the component * * @see #dirtyComponents * @see #addDirtyRegion * @see #isCompletelyDirty * @see #markCompletelyClean * @see #markCompletelyDirty */ public Rectangle getDirtyRegion(JComponent component) { return (Rectangle) dirtyComponents.get(component); } /** * Mark a component as dirty over its entire bounds. * * @param component The component to mark as dirty * * @see #dirtyComponents * @see #addDirtyRegion * @see #getDirtyRegion * @see #isCompletelyDirty * @see #markCompletelyClean */ public void markCompletelyDirty(JComponent component) { Rectangle r = component.getBounds(); addDirtyRegion(component, r.x, r.y, r.width, r.height); } /** * Remove all dirty regions for a specified component * * @param component The component to mark as clean * * @see #dirtyComponents * @see #addDirtyRegion * @see #getDirtyRegion * @see #isCompletelyDirty * @see #markCompletelyDirty */ public void markCompletelyClean(JComponent component) { dirtyComponents.remove(component); } /** * Return <code>true</code> if the specified component is completely * contained within its dirty region, otherwise <code>false</code> * * @param component The component to check for complete dirtyness * * @return Whether the component is completely dirty * * @see #dirtyComponents * @see #addDirtyRegion * @see #getDirtyRegion * @see #isCompletelyDirty * @see #markCompletelyClean */ public boolean isCompletelyDirty(JComponent component) { Rectangle dirty = (Rectangle) dirtyComponents.get(component); if (dirty == null) return false; Rectangle r = component.getBounds(); if (r == null) return true; return dirty.contains(r); } /** * Validate all components which have been marked invalid in the {@link * #invalidComponents} vector. */ public void validateInvalidComponents() { for (Enumeration e = invalidComponents.elements(); e.hasMoreElements(); ) { JComponent comp = (JComponent) e.nextElement(); if (! (comp.isVisible() && comp.isShowing())) continue; comp.validate(); } invalidComponents.clear(); } /** * Repaint all regions of all components which have been marked dirty in * the {@link #dirtyComponents} table. */ public void paintDirtyRegions() { // step 1: pull out roots and calculate spanning damage HashMap roots = new HashMap(); for (Enumeration e = dirtyComponents.keys(); e.hasMoreElements(); ) { JComponent comp = (JComponent) e.nextElement(); if (! (comp.isVisible() && comp.isShowing())) continue; Rectangle damaged = getDirtyRegion(comp); if (damaged.width == 0 || damaged.height == 0) continue; JRootPane root = comp.getRootPane(); // If the component has no root, no repainting will occur. if (root == null) continue; Rectangle rootDamage = SwingUtilities.convertRectangle(comp, damaged, root); if (! roots.containsKey(root)) { roots.put(root, rootDamage); } else { roots.put(root, ((Rectangle)roots.get(root)).union(rootDamage)); } } dirtyComponents.clear(); // step 2: paint those roots Iterator i = roots.entrySet().iterator(); while(i.hasNext()) { Map.Entry ent = (Map.Entry) i.next(); JRootPane root = (JRootPane) ent.getKey(); Rectangle rect = (Rectangle) ent.getValue(); root.paintImmediately(rect); } } /** * Get an offscreen buffer for painting a component's image. This image * may be smaller than the proposed dimensions, depending on the value of * the {@link #doubleBufferMaximumSize} property. * * @param component The component to return an offscreen buffer for * @param proposedWidth The proposed width of the offscreen buffer * @param proposedHeight The proposed height of the offscreen buffer * * @return A shared offscreen buffer for painting * * @see #doubleBuffer */ public Image getOffscreenBuffer(Component component, int proposedWidth, int proposedHeight) { if (doubleBuffer == null || (((doubleBuffer.getWidth(null) < proposedWidth) || (doubleBuffer.getHeight(null) < proposedHeight)) && (proposedWidth < doubleBufferMaximumSize.width) && (proposedHeight < doubleBufferMaximumSize.height))) { doubleBuffer = component.createImage(proposedWidth, proposedHeight); } return doubleBuffer; } /** * Get the value of the {@link #doubleBufferMaximumSize} property. * * @return The current value of the property * * @see #setDoubleBufferMaximumSize */ public Dimension getDoubleBufferMaximumSize() { return doubleBufferMaximumSize; } /** * Set the value of the {@link #doubleBufferMaximumSize} property. * * @param size The new value of the property * * @see #getDoubleBufferMaximumSize */ public void setDoubleBufferMaximumSize(Dimension size) { doubleBufferMaximumSize = size; } /** * Set the value of the {@link #doubleBufferingEnabled} property. * * @param buffer The new value of the property * * @see #getDoubleBufferingEnabled */ public void setDoubleBufferingEnabled(boolean buffer) { doubleBufferingEnabled = buffer; } /** * Get the value of the {@link #doubleBufferingEnabled} property. * * @return The current value of the property * * @see #setDoubleBufferingEnabled */ public boolean isDoubleBufferingEnabled() { return doubleBufferingEnabled; } public String toString() { return "RepaintManager"; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?