6596915: JCK-runtime-6a/tests/api/java_awt/Component/index.html tesPaintAll fails
authorserb
Fri, 15 Jul 2011 19:23:03 +0400
changeset 10096 f9ac9a52952d
parent 10095 daec42746ec0
child 10097 67449ffe5991
6596915: JCK-runtime-6a/tests/api/java_awt/Component/index.html tesPaintAll fails Reviewed-by: art, dcherepanov, anthony
jdk/src/solaris/classes/sun/awt/X11/XButtonPeer.java
jdk/src/solaris/classes/sun/awt/X11/XCheckboxPeer.java
jdk/src/solaris/classes/sun/awt/X11/XChoicePeer.java
jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java
jdk/src/solaris/classes/sun/awt/X11/XLabelPeer.java
jdk/src/solaris/classes/sun/awt/X11/XListPeer.java
jdk/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java
jdk/src/solaris/classes/sun/awt/X11/XMenuWindow.java
jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java
jdk/src/solaris/classes/sun/awt/X11/XRepaintArea.java
jdk/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java
jdk/src/solaris/classes/sun/awt/X11/XScrollbarPeer.java
jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java
jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java
jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java
jdk/src/solaris/classes/sun/awt/X11/XWindow.java
jdk/test/java/awt/Component/PaintAll/PaintAll.java
--- a/jdk/src/solaris/classes/sun/awt/X11/XButtonPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XButtonPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -33,12 +33,9 @@
 import javax.swing.plaf.basic.*;
 import javax.swing.SwingUtilities;
 import javax.swing.SwingConstants;
-
 public class XButtonPeer extends XComponentPeer implements ButtonPeer {
-
-    boolean pressed;
-    boolean armed;
-
+    private boolean pressed;
+    private boolean armed;
     private Insets focusInsets;
     private Insets borderInsets;
     private Insets contentAreaInsets;
@@ -86,11 +83,6 @@
         this.label = label;
         repaint();
     }
-
-    public void paint(Graphics g) {
-        paint(g,target);
-    }
-
     public void setBackground(Color c) {
         updateMotifColors(c);
         super.setBackground(c);
@@ -133,16 +125,10 @@
           case  MouseEvent.MOUSE_ENTERED:
               if (pressed)
                   armed = true;
-//                 repaint();
-
               break;
-
           case MouseEvent.MOUSE_EXITED:
               armed = false;
-//                 repaint();
-
               break;
-
         }
     }
 
@@ -209,18 +195,14 @@
     public Dimension minimumSize() {
         return getMinimumSize();
     }
-
-
-    /*
-       This method is called from Toolkit Thread and so it should not call any client code
-
-    */
-    public void paint(Graphics g, Component c)
-    {
-        if (!disposed && (g != null))
-        {
+    /**
+     * This method is called from Toolkit Thread and so it should not call any
+     * client code.
+     */
+    @Override
+    void paintPeer(final Graphics g) {
+        if (!disposed) {
             Dimension size = getPeerSize();
-
             g.setColor( getPeerBackground() );   /* erase the existing button remains */
             g.fillRect(0,0, size.width , size.height);
             paintBorder(g,borderInsets.left,
@@ -239,11 +221,9 @@
 
             viewRect.width = size.width - (contentAreaInsets.left+contentAreaInsets.right);
             viewRect.height = size.height - (contentAreaInsets.top+contentAreaInsets.bottom);
-
             viewRect.x = contentAreaInsets.left;
-            viewRect.y = contentAreaInsets.right;
+            viewRect.y = contentAreaInsets.top;
             String llabel = (label != null) ? label : "";
-
             // layout the text and icon
             String text = SwingUtilities.layoutCompoundLabel(
                                                              fm, llabel, null,
@@ -309,10 +289,9 @@
         else {
             /*** paint the text disabled ***/
             g.setColor(getPeerBackground().brighter());
-
             BasicGraphicsUtils.drawStringUnderlineCharAt(g,text, mnemonicIndex,
                                                          textRect.x, textRect.y + fm.getAscent());
-            g.setColor(c.getBackground().darker());
+            g.setColor(getPeerBackground().darker());
             BasicGraphicsUtils.drawStringUnderlineCharAt(g,text, mnemonicIndex,
                                                          textRect.x - 1, textRect.y + fm.getAscent() - 1);
         }
--- a/jdk/src/solaris/classes/sun/awt/X11/XCheckboxPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XCheckboxPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -297,40 +297,33 @@
 
         double fsize = (double) checkBoxSize;
         myCheckMark = AffineTransform.getScaleInstance(fsize / MASTER_SIZE, fsize / MASTER_SIZE).createTransformedShape(MASTER_CHECKMARK);
-
     }
-
-    public void paint(Graphics g) {
-        if (g != null) {
-            //layout();
-            Dimension size = getPeerSize();
-            Font f = getPeerFont();
-
-            flush();
-            g.setColor(getPeerBackground());   // erase the existing button
-            g.fillRect(0,0, size.width, size.height);
+    @Override
+    void paintPeer(final Graphics g) {
+        //layout();
+        Dimension size = getPeerSize();
+        Font f = getPeerFont();
+        flush();
+        g.setColor(getPeerBackground());   // erase the existing button
+        g.fillRect(0,0, size.width, size.height);
+        if (label != null) {
+            g.setFont(f);
+            paintText(g, textRect, label);
+        }
 
-            if (label != null) {
-                g.setFont(f);
-                paintText(g, textRect, label);
-            }
-
-            if (hasFocus()) {
-                paintFocus(g,
-                           focusRect.x,
-                           focusRect.y,
-                           focusRect.width,
-                           focusRect.height);
-            }
-
-            // Paint the checkbox or radio button
-            if (checkBoxGroup == null) {
-                paintCheckbox(g, cbX, cbY, checkBoxSize, checkBoxSize);
-            }
-            else {
-                paintRadioButton(g, cbX, cbY, checkBoxSize, checkBoxSize);
-            }
-
+        if (hasFocus()) {
+            paintFocus(g,
+                       focusRect.x,
+                       focusRect.y,
+                       focusRect.width,
+                       focusRect.height);
+        }
+        // Paint the checkbox or radio button
+        if (checkBoxGroup == null) {
+            paintCheckbox(g, cbX, cbY, checkBoxSize, checkBoxSize);
+        }
+        else {
+            paintRadioButton(g, cbX, cbY, checkBoxSize, checkBoxSize);
         }
         flush();
     }
--- a/jdk/src/solaris/classes/sun/awt/X11/XChoicePeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XChoicePeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -550,10 +550,10 @@
     /**
      * Paint the choice
      */
-    public void paint(Graphics g) {
+    @Override
+    void paintPeer(final Graphics g) {
         flush();
         Dimension size = getPeerSize();
-
         // TODO: when mouse is down over button, widget should be drawn depressed
         g.setColor(getPeerBackground());
         g.fillRect(0, 0, width, height);
@@ -912,16 +912,22 @@
         /*
          * fillRect with current Background color on the whole dropdown list.
          */
-        public void paintBackground(){
-            Graphics g = getGraphics();
-            g.setColor(getPeerBackground());
-            g.fillRect(0, 0, width, height);
+        public void paintBackground() {
+            final Graphics g = getGraphics();
+            if (g != null) {
+                try {
+                    g.setColor(getPeerBackground());
+                    g.fillRect(0, 0, width, height);
+                } finally {
+                    g.dispose();
+                }
+            }
         }
-
         /*
          * 6405689. In some cases we should erase background to eliminate painting
          * artefacts.
          */
+        @Override
         public void repaint() {
             if (!isVisible()) {
                 return;
@@ -931,8 +937,8 @@
             }
             super.repaint();
         }
-
-        public void paint(Graphics g) {
+        @Override
+        public void paintPeer(Graphics g) {
             //System.out.println("UC.paint()");
             Choice choice = (Choice)target;
             Color colors[] = XChoicePeer.this.getGUIcolors();
--- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -38,7 +38,6 @@
 import java.awt.GraphicsConfiguration;
 import java.awt.Image;
 import java.awt.Insets;
-import java.awt.KeyboardFocusManager;
 import java.awt.Rectangle;
 import java.awt.SystemColor;
 import java.awt.Toolkit;
@@ -59,15 +58,11 @@
 import java.awt.image.VolatileImage;
 import java.awt.peer.ComponentPeer;
 import java.awt.peer.ContainerPeer;
-import java.awt.peer.LightweightPeer;
 import java.lang.reflect.*;
 import java.security.*;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Set;
-import java.util.Vector;
 import sun.util.logging.PlatformLogger;
-
 import sun.awt.*;
 import sun.awt.event.IgnorePaintEvent;
 import sun.awt.image.SunVolatileImage;
@@ -428,27 +423,23 @@
     public void disable() {
         setEnabled(false);
     }
-
-    public void paint(Graphics g) {
+    @Override
+    public void paint(final Graphics g) {
+        super.paint(g);
+        // allow target to change the picture
+        target.paint(g);
     }
-    public void repaint(long tm, int x, int y, int width, int height) {
-        repaint();
-    }
-
 
     public Graphics getGraphics() {
         return getGraphics(surfaceData, getPeerForeground(), getPeerBackground(), getPeerFont());
     }
-
-
-
     public void print(Graphics g) {
         // clear rect here to emulate X clears rect before Expose
         g.setColor(target.getBackground());
         g.fillRect(0, 0, target.getWidth(), target.getHeight());
         g.setColor(target.getForeground());
         // paint peer
-        paint(g);
+        paintPeer(g);
         // allow target to change the picture
         target.print(g);
     }
--- a/jdk/src/solaris/classes/sun/awt/X11/XLabelPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XLabelPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -85,7 +85,8 @@
      */
     // NOTE: This method is called by privileged threads.
     //       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
-    public void paint(Graphics g) {
+    @Override
+    void paintPeer(final Graphics g) {
         int textX = 0;
         int textY = 0;
         g.setColor(getPeerBackground());
--- a/jdk/src/solaris/classes/sun/awt/X11/XListPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XListPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -363,9 +363,7 @@
             return Math.min(items.size()-1, itemsInWindow()-1);
         }
     }
-
     public void repaintScrollbarRequest(XScrollbar scrollbar) {
-        Graphics g = getGraphics();
         if (scrollbar == hsb)  {
             repaint(PAINT_HSCROLL);
         }
@@ -373,9 +371,6 @@
             repaint(PAINT_VSCROLL);
         }
     }
-
-
-
     /**
      * Overridden for performance
      */
@@ -410,18 +405,20 @@
      * @param distance the distance to copy the source area
      */
     private void repaint(int firstItem, int lastItem, int options, Rectangle source, Point distance) {
-        Graphics g = getGraphics();
-        try {
-            painter.paint(g, firstItem, lastItem, options, source, distance);
-        } finally {
-            g.dispose();
+        final Graphics g = getGraphics();
+        if (g != null) {
+            try {
+                painter.paint(g, firstItem, lastItem, options, source, distance);
+                target.paint(g);
+            } finally {
+                g.dispose();
+            }
         }
     }
-
-    public void paint(Graphics g) {
+    @Override
+    void paintPeer(final Graphics g) {
         painter.paint(g, getFirstVisibleItem(), getLastVisibleItem(), PAINT_ALL);
     }
-
     public boolean isFocusable() { return true; }
 
     // TODO: share/promote the Focus methods?
--- a/jdk/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XMenuBarPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -415,7 +415,7 @@
      * Overriden XWindow painting & printing
      *
      ************************************************/
-    public void paint(Graphics g) {
+    public void paintPeer(Graphics g) {
         resetColors();
         /* Calculate menubar dimension. */
         int width = getWidth();
--- a/jdk/src/solaris/classes/sun/awt/X11/XMenuWindow.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XMenuWindow.java	Fri Jul 15 19:23:03 2011 +0400
@@ -432,9 +432,9 @@
     /**
      * Paints menu window
      */
-    public void paint(Graphics g) {
+    @Override
+    public void paintPeer(Graphics g) {
         resetColors();
-
         int width = getWidth();
         int height = getHeight();
 
--- a/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XPanelPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -60,14 +60,13 @@
     public Insets getInsets() {
         return new Insets(0, 0, 0, 0);
     }
-
     public void paint(Graphics g) {
         super.paint(g);
-        /*      SunGraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
-                runComponents(((Container)target).getComponents(), g,
-                SunGraphicsCallback.LIGHTWEIGHTS |
-                SunGraphicsCallback.HEAVYWEIGHTS);
-        */ }
+        SunGraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
+            runComponents(((Container)target).getComponents(), g,
+                          SunGraphicsCallback.LIGHTWEIGHTS |
+                          SunGraphicsCallback.HEAVYWEIGHTS);
+    }
     public void print(Graphics g) {
         super.print(g);
         SunGraphicsCallback.PrintHeavyweightComponentsCallback.getInstance().
--- a/jdk/src/solaris/classes/sun/awt/X11/XRepaintArea.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XRepaintArea.java	Fri Jul 15 19:23:03 2011 +0400
@@ -53,9 +53,9 @@
      */
     protected void updateComponent(Component comp, Graphics g) {
         if (comp != null) {
-            ComponentPeer peer = comp.getPeer();
+            final XComponentPeer peer = (XComponentPeer) comp.getPeer();
             if (peer != null) {
-                peer.paint(g);
+                peer.paintPeer(g);
             }
             super.updateComponent(comp, g);
         }
@@ -66,9 +66,9 @@
      */
     protected void paintComponent(Component comp, Graphics g) {
         if (comp != null) {
-            ComponentPeer peer = comp.getPeer();
+            final XComponentPeer peer = (XComponentPeer) comp.getPeer();
             if (peer != null) {
-                peer.paint(g);
+                peer.paintPeer(g);
             }
             super.paintComponent(comp, g);
         }
--- a/jdk/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XScrollPanePeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -293,10 +293,12 @@
                 setAdjustableValue(hadj, hsb.getValue(), type);
                 sx = -(hsb.getValue());
                 Graphics g = getGraphics();
-                try {
-                    paintHorScrollbar(g, colors, true);
-                } finally {
-                    g.dispose();
+                if (g != null) {
+                    try {
+                        paintHorScrollbar(g, colors, true);
+                    } finally {
+                        g.dispose();
+                    }
                 }
             }
             if ((flag & VERTICAL) != 0) {
@@ -305,10 +307,12 @@
                 setAdjustableValue(vadj, vsb.getValue(), type);
                 sy = -(vsb.getValue());
                 Graphics g = getGraphics();
-                try {
-                    paintVerScrollbar(g, colors, true);
-                } finally {
-                    g.dispose();
+                if (g != null) {
+                    try {
+                        paintVerScrollbar(g, colors, true);
+                    } finally {
+                        g.dispose();
+                    }
                 }
             }
         }
@@ -327,14 +331,21 @@
             ite.getCause().printStackTrace();
         }
     }
-
-
-    public void paint(Graphics g) {
-        paintComponent(g);
+    @Override
+    void paintPeer(final Graphics g) {
+        final Color[] colors = getGUIcolors();
+        g.setColor(colors[BACKGROUND_COLOR]);
+        final int h = height - hsbSpace;
+        final int w = width - vsbSpace;
+        g.fillRect(0, 0, w, h);
+        // paint rectangular region between scrollbars
+        g.fillRect(w, h, vsbSpace, hsbSpace);
+        if (MARGIN > 0) {
+            draw3DRect(g, colors, 0, 0, w - 1, h - 1, false);
+        }
+        paintScrollBars(g, colors);
     }
-
-
-    void paintScrollBars(Graphics g, Color[] colors) {
+    private void paintScrollBars(Graphics g, Color[] colors) {
         if (vsbSpace > 0) {
             paintVerScrollbar(g, colors, true);
             // paint the whole scrollbar
@@ -345,51 +356,32 @@
             // paint the whole scrollbar
         }
     }
-
-   void repaintScrollBars() {
-       Graphics g = getGraphics();
-       Color colors[] = getGUIcolors();
-       if (g != null) {
-           paintScrollBars(g,colors);
-       }
-       g.dispose();
-   }
-
-    public void repaintScrollbarRequest(XScrollbar sb) {
-       Graphics g = getGraphics();
-       Color colors[] = getGUIcolors();
-       if (g != null) {
-           if (sb ==  vsb)  {
-               paintVerScrollbar(g,colors,true);
-           }
-           else if (sb ==  hsb) {
-               paintHorScrollbar(g,colors,true);
-           }
-       }
+    void repaintScrollBars() {
+        Graphics g = getGraphics();
+        Color colors[] = getGUIcolors();
+        if (g != null) {
+            try {
+                paintScrollBars(g, colors);
+            } finally {
+                g.dispose();
+            }
+        }
     }
-
-    /**
-     * Paint the scrollpane.
-     */
-    public void paintComponent(Graphics g) {
-
+    public void repaintScrollbarRequest(XScrollbar sb) {
+        Graphics g = getGraphics();
         Color colors[] = getGUIcolors();
-        g.setColor(colors[BACKGROUND_COLOR]);
-        int h = height - hsbSpace;
-        int w = width - vsbSpace;
-
-        g.fillRect(0, 0, w, h);
-
-        // paint rectangular region between scrollbars
-        g.fillRect(w, h, vsbSpace, hsbSpace);
-
-        if (MARGIN > 0) {
-            draw3DRect(g, colors, 0, 0, w - 1, h - 1, false);
+        if (g != null) {
+            try {
+                if (sb == vsb) {
+                    paintVerScrollbar(g, colors, true);
+                } else if (sb == hsb) {
+                    paintHorScrollbar(g, colors, true);
+                }
+            } finally {
+                g.dispose();
+            }
         }
-
-        paintScrollBars(g,colors);
     }
-
     public void handleEvent(java.awt.AWTEvent e) {
         super.handleEvent(e);
 
--- a/jdk/src/solaris/classes/sun/awt/X11/XScrollbarPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XScrollbarPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -90,18 +90,12 @@
             ? new Dimension(getDefaultDimension(), DEFAULT_LENGTH)
                 : new Dimension(DEFAULT_LENGTH, getDefaultDimension());
     }
-
-    public void repaint() {
-        Graphics g = getGraphics();
-        if (g != null) paint(g);
-    }
-
     /**
      * Paint the scrollbar.
      */
-    public void paint(Graphics g) {
-        Scrollbar sb = (Scrollbar)target;
-        Color colors[] = getGUIcolors();
+    @Override
+    void paintPeer(final Graphics g) {
+        final Color[] colors = getGUIcolors();
         g.setColor(colors[BACKGROUND_COLOR]);
         tsb.paint(g, colors, true);
         // paint the whole scrollbar
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -298,15 +298,14 @@
      * Paint the component
      * this method is called when the repaint instruction has been used
      */
-
     public void repaint() {
         if (textPane  != null)  {
             //textPane.validate();
             textPane.repaint();
         }
     }
-
-    public void paint(Graphics g) {
+    @Override
+    void paintPeer(final Graphics g) {
         if (textPane  != null)  {
             textPane.paint(g);
         }
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java	Fri Jul 15 19:23:03 2011 +0400
@@ -370,12 +370,11 @@
     public void repaint() {
         if (xtext  != null) xtext.repaint();
     }
-
-    public void paint(Graphics g) {
+    @Override
+    void paintPeer(final Graphics g) {
         if (xtext  != null) xtext.paint(g);
     }
 
-
     public void print(Graphics g) {
         if (xtext != null) {
             xtext.print(g);
--- a/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWarningWindow.java	Fri Jul 15 19:23:03 2011 +0400
@@ -241,16 +241,19 @@
     Font getFont () {
         return ownerWindow.getFont();
     }
+
+    @Override
     public void repaint() {
-        Rectangle bounds = getBounds();
-        Graphics g = getGraphics();
-        try {
-            paint(g, 0, 0, bounds.width, bounds.height);
-        } finally {
-            g.dispose();
+        final Rectangle bounds = getBounds();
+        final Graphics g = getGraphics();
+        if (g != null) {
+            try {
+                paint(g, 0, 0, bounds.width, bounds.height);
+            } finally {
+                g.dispose();
+            }
         }
     }
-
     @Override
     public void handleExposeEvent(XEvent xev) {
         super.handleExposeEvent(xev);
@@ -263,11 +266,13 @@
         SunToolkit.executeOnEventHandlerThread(target,
                 new Runnable() {
                     public void run() {
-                        Graphics g = getGraphics();
-                        try {
-                            paint(g, x, y, width, height);
-                        } finally {
-                            g.dispose();
+                        final Graphics g = getGraphics();
+                        if (g != null) {
+                            try {
+                                paint(g, x, y, width, height);
+                            } finally {
+                                g.dispose();
+                            }
                         }
                     }
                 });
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Fri Jul 15 19:19:33 2011 +0400
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java	Fri Jul 15 19:23:03 2011 +0400
@@ -502,9 +502,8 @@
     public boolean isEmbedded() {
         return embedded;
     }
-
     public  void repaint(int x,int y, int width, int height) {
-        if (!isVisible()) {
+        if (!isVisible() || getWidth() == 0 || getHeight() == 0) {
             return;
         }
         Graphics g = getGraphics();
@@ -517,12 +516,11 @@
             }
         }
     }
-
-    public  void repaint() {
-        if (!isVisible()) {
+    void repaint() {
+        if (!isVisible() || getWidth() == 0 || getHeight() == 0) {
             return;
         }
-        Graphics g = getGraphics();
+        final Graphics g = getGraphics();
         if (g != null) {
             try {
                 paint(g);
@@ -531,10 +529,13 @@
             }
         }
     }
-
-    void paint(Graphics g) {
+    public void paint(final Graphics g) {
+        // paint peer
+        paintPeer(g);
     }
 
+    void paintPeer(final Graphics g) {
+    }
     //used by Peers to avoid flickering withing paint()
     protected void flush(){
         XToolkit.awtLock();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Component/PaintAll/PaintAll.java	Fri Jul 15 19:23:03 2011 +0400
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2011, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import sun.awt.SunToolkit;
+
+import java.awt.Button;
+import java.awt.Canvas;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.GridLayout;
+import java.awt.Label;
+import java.awt.List;
+import java.awt.Panel;
+import java.awt.ScrollPane;
+import java.awt.Scrollbar;
+import java.awt.TextArea;
+import java.awt.TextField;
+import java.awt.Toolkit;
+import java.awt.image.BufferedImage;
+
+/*
+  @test
+  @bug 6596915
+  @summary Test Component.paintAll() method
+  @author sergey.bylokhov@oracle.com: area=awt.component
+  @run main PaintAll
+*/
+public class PaintAll {
+
+    private static volatile boolean lwPainted;
+    private static volatile boolean buttonPainted;
+    private static volatile boolean canvasPainted;
+    private static volatile boolean checkboxPainted;
+    private static volatile boolean choicePainted;
+    private static volatile boolean containerPainted;
+    private static volatile boolean framePainted;
+    private static volatile boolean labelPainted;
+    private static volatile boolean listPainted;
+    private static volatile boolean panelPainted;
+    private static volatile boolean scrollbarPainted;
+    private static volatile boolean scrollPanePainted;
+    private static volatile boolean textAreaPainted;
+    private static volatile boolean textFieldPainted;
+
+    private static final Button buttonStub = new Button() {
+        @Override
+        public void paint(final Graphics g) {
+            buttonPainted = true;
+        }
+    };
+
+    private static final Canvas canvasStub = new Canvas() {
+        @Override
+        public void paint(final Graphics g) {
+            canvasPainted = true;
+        }
+    };
+
+    private static final Checkbox checkboxStub = new Checkbox() {
+        @Override
+        public void paint(final Graphics g) {
+            checkboxPainted = true;
+        }
+    };
+
+    private static final Choice choiceStub = new Choice() {
+        @Override
+        public void paint(final Graphics g) {
+            choicePainted = true;
+        }
+    };
+
+    private static final Component lwComponentStub = new Component() {
+        @Override
+        public void paint(final Graphics g) {
+            lwPainted = true;
+        }
+    };
+
+    private static final Container containerStub = new Container() {
+        @Override
+        public void paint(final Graphics g) {
+            containerPainted = true;
+        }
+    };
+
+    private static final Frame frame = new Frame() {
+        @Override
+        public void paint(final Graphics g) {
+            super.paint(g);
+            framePainted = true;
+        }
+    };
+
+    private static final Label labelStub = new Label() {
+        @Override
+        public void paint(final Graphics g) {
+            labelPainted = true;
+        }
+    };
+
+    private static final List listStub = new List() {
+        @Override
+        public void paint(final Graphics g) {
+            listPainted = true;
+        }
+    };
+
+    private static final Panel panelStub = new Panel() {
+        @Override
+        public void paint(final Graphics g) {
+            panelPainted = true;
+        }
+    };
+
+    private static final Scrollbar scrollbarStub = new Scrollbar() {
+        @Override
+        public void paint(final Graphics g) {
+            scrollbarPainted = true;
+        }
+    };
+
+    private static final ScrollPane scrollPaneStub = new ScrollPane() {
+        @Override
+        public void paint(final Graphics g) {
+            scrollPanePainted = true;
+        }
+    };
+
+    private static final TextArea textAreaStub = new TextArea() {
+        @Override
+        public void paint(final Graphics g) {
+            textAreaPainted = true;
+        }
+    };
+
+    private static final TextField textFieldStub = new TextField() {
+        @Override
+        public void paint(final Graphics g) {
+            textFieldPainted = true;
+        }
+    };
+
+    public static void main(final String[] args) throws Exception {
+        //Frame initialisation
+        final BufferedImage graphicsProducer =
+                new BufferedImage(BufferedImage.TYPE_INT_ARGB, 1, 1);
+
+        final Graphics g = graphicsProducer.getGraphics();
+
+        frame.setLayout(new GridLayout());
+        frame.add(buttonStub);
+        frame.add(canvasStub);
+        frame.add(checkboxStub);
+        frame.add(choiceStub);
+        frame.add(lwComponentStub);
+        frame.add(containerStub);
+        frame.add(labelStub);
+        frame.add(listStub);
+        frame.add(panelStub);
+        frame.add(scrollbarStub);
+        frame.add(scrollPaneStub);
+        frame.add(textAreaStub);
+        frame.add(textFieldStub);
+        frame.setSize(new Dimension(500, 500));
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+        sleep();
+
+        //Check results.
+        validation();
+
+        //Reset all flags to 'false'.
+        initPaintedFlags();
+
+        //Tested method.
+        frame.paintAll(g);
+        sleep();
+
+        //Check results.
+        validation();
+        cleanup();
+    }
+
+    private static void initPaintedFlags() {
+        lwPainted = false;
+        buttonPainted = false;
+        canvasPainted = false;
+        checkboxPainted = false;
+        choicePainted = false;
+        containerPainted = false;
+        framePainted = false;
+        labelPainted = false;
+        listPainted = false;
+        panelPainted = false;
+        scrollbarPainted = false;
+        scrollPanePainted = false;
+        textAreaPainted = false;
+        textFieldPainted = false;
+    }
+
+    private static void validation() {
+        if (!buttonPainted) {
+            fail("Paint is not called a Button "
+                 + "when paintAll() invoked on a parent");
+        }
+        if (!canvasPainted) {
+            fail("Paint is not called a Canvas "
+                 + "when paintAll() invoked on a parent");
+        }
+        if (!checkboxPainted) {
+            fail("Paint is not called a Checkbox "
+                 + "when paintAll() invoked on a parent");
+        }
+        if (!choicePainted) {
+            fail("Paint is not called a Choice "
+                 + "when paintAll() invoked on a parent");
+        }
+        if (!lwPainted) {
+            fail("Paint is not called on a lightweight"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!containerPainted) {
+            fail("Paint is not called on a Container"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!labelPainted) {
+            fail("Paint is not called on a Label"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!listPainted) {
+            fail("Paint is not called on a List"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!panelPainted) {
+            fail("Paint is not called on a Panel"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!scrollbarPainted) {
+            fail("Paint is not called on a Scrollbar"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!scrollPanePainted) {
+            fail("Paint is not called on a ScrollPane"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!textAreaPainted) {
+            fail("Paint is not called on a TextArea"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!textFieldPainted) {
+            fail("Paint is not called on a TextField"
+                 + " subcomponent when paintAll() invoked on a parent");
+        }
+        if (!framePainted) {
+            fail("Paint is not called on a Frame when paintAll()");
+        }
+    }
+
+    private static void sleep() {
+        ((SunToolkit) Toolkit.getDefaultToolkit()).realSync();
+        try {
+            Thread.sleep(500L);
+        } catch (InterruptedException ignored) {
+        }
+    }
+
+    private static void fail(final String message) {
+        cleanup();
+        throw new RuntimeException(message);
+    }
+
+    private static void cleanup() {
+        frame.dispose();
+    }
+}