📄 repaintmanager.java
字号:
* event queue. * * @param component The component to add * * @see #removeInvalidComponent */ public synchronized void addInvalidComponent(JComponent component) { Component ancestor = component.getParent(); while (ancestor != null && (! (ancestor instanceof JComponent) || ! ((JComponent) ancestor).isValidateRoot() )) ancestor = ancestor.getParent(); if (ancestor != null && ancestor instanceof JComponent && ((JComponent) ancestor).isValidateRoot()) component = (JComponent) ancestor; if (invalidComponents.contains(component)) return; invalidComponents.add(component); if (! repaintWorker.isLive()) { 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.remove(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 || !component.isShowing()) return; Rectangle r = new Rectangle(x, y, w, h); if (dirtyComponents.containsKey(component)) r = r.union((Rectangle)dirtyComponents.get(component)); else insertInRepaintOrder(component); dirtyComponents.put(component, r); if (! repaintWorker.isLive()) { repaintWorker.setLive(true); SwingUtilities.invokeLater(repaintWorker); } } /** * Inserts a component into the repaintOrder list in an ordered fashion, * using a binary search. * * @param c the component to be inserted */ private void insertInRepaintOrder(JComponent c) { if (comparator == null) comparator = new ComponentComparator(); int insertIndex = Collections.binarySearch(repaintOrder, c, comparator); if (insertIndex < 0) insertIndex = -(insertIndex + 1); repaintOrder.add(insertIndex, c); } /** * 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) { Rectangle dirty = (Rectangle) dirtyComponents.get(component); if (dirty == null) dirty = new Rectangle(); return dirty; } /** * 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); component.isCompletelyDirty = true; } /** * 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) { synchronized (this) { dirtyComponents.remove(component); } component.isCompletelyDirty = false; } /** * 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) { if (! dirtyComponents.containsKey(component)) return false; return component.isCompletelyDirty; } /** * Validate all components which have been marked invalid in the {@link * #invalidComponents} vector. */ public void validateInvalidComponents() { // In order to keep the blocking of application threads minimal, we switch // the invalidComponents field with the workInvalidComponents field and // work with the workInvalidComponents field. synchronized(this) { ArrayList swap = invalidComponents; invalidComponents = workInvalidComponents; workInvalidComponents = swap; } for (Iterator i = workInvalidComponents.iterator(); i.hasNext(); ) { JComponent comp = (JComponent) i.next(); if (! (comp.isVisible() && comp.isShowing())) continue; comp.validate(); } workInvalidComponents.clear(); } /** * Repaint all regions of all components which have been marked dirty in * the {@link #dirtyComponents} table. */ public synchronized void paintDirtyRegions() { // In order to keep the blocking of application threads minimal, we switch // the dirtyComponents field with the workdirtyComponents field and the // repaintOrder field with the workRepaintOrder field and work with the // work* fields. synchronized(this) { ArrayList swap = workRepaintOrder; workRepaintOrder = repaintOrder; repaintOrder = swap; HashMap swap2 = workDirtyComponents; workDirtyComponents = dirtyComponents; dirtyComponents = swap2; } for (Iterator i = workRepaintOrder.iterator(); i.hasNext();) { JComponent comp = (JComponent) i.next(); // If a component is marked completely clean in the meantime, then skip // it. Rectangle damaged = (Rectangle) workDirtyComponents.get(comp); if (damaged == null || damaged.isEmpty()) continue; comp.paintImmediately(damaged); } workRepaintOrder.clear(); workDirtyComponents.clear(); } /** * 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; } /** * Creates and returns a volatile offscreen buffer for the specified * component that can be used as a double buffer. The returned image * is a {@link VolatileImage}. Its size will be <code>(proposedWidth, * proposedHeight)</code> except when the maximum double buffer size * has been set in this RepaintManager. * * @param comp the Component for which to create a volatile buffer * @param proposedWidth the proposed width of the buffer * @param proposedHeight the proposed height of the buffer * * @since 1.4 * * @see VolatileImage */ public Image getVolatileOffscreenBuffer(Component comp, int proposedWidth, int proposedHeight) { int maxWidth = doubleBufferMaximumSize.width; int maxHeight = doubleBufferMaximumSize.height; return comp.createVolatileImage(Math.min(maxWidth, proposedWidth), Math.min(maxHeight, proposedHeight)); } /** * 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 #isDoubleBufferingEnabled */ 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -