--- old/src/share/classes/javax/swing/RepaintManager.java 2014-01-31 11:51:00.000000000 +0400 +++ new/src/share/classes/javax/swing/RepaintManager.java 2014-01-31 11:51:00.000000000 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,6 +45,8 @@ import sun.security.action.GetPropertyAction; import com.sun.java.swing.SwingUtilities3; +import sun.swing.SwingAccessor; +import sun.swing.SwingUtilities2.RepaintListener; /** * This class manages repaint requests, allowing the number @@ -184,6 +186,17 @@ static { + SwingAccessor.setRepaintManagerAccessor(new SwingAccessor.RepaintManagerAccessor() { + @Override + public void addRepaintListener(RepaintManager rm, RepaintListener l) { + rm.addRepaintListener(l); + } + @Override + public void removeRepaintListener(RepaintManager rm, RepaintListener l) { + rm.removeRepaintListener(l); + } + }); + volatileImageBufferEnabled = "true".equals(AccessController. doPrivileged(new GetPropertyAction( "swing.volatileImageBufferEnabled", "true"))); @@ -1266,7 +1279,34 @@ int deltaX, int deltaY, boolean clip) { getPaintManager().copyArea(c, g, x, y, w, h, deltaX, deltaY, clip); } - + + private java.util.List repaintListeners = new ArrayList<>(1); + + private void addRepaintListener(RepaintListener l) { + repaintListeners.add(l); + } + + private void removeRepaintListener(RepaintListener l) { + repaintListeners.remove(l); + } + + /** + * Notify the attached repaint listeners that an area of the {@code c} component + * has been immediately repainted, that is without scheduling a repaint runnable, + * due to performing a "blit" (via calling the {@code copyArea} method). + * + * @param c the component + * @param x the x coordinate of the area + * @param y the y coordinate of the area + * @param w the width of the area + * @param h the height of the area + */ + void notifyRepaintPerformed(JComponent c, int x, int y, int w, int h) { + for (RepaintListener l : repaintListeners) { + l.repaintPerformed(c, x, y, w, h); + } + } + /** * Invoked prior to any paint/copyArea method calls. This will * be followed by an invocation of endPaint.