<AWT Dev> Review request for 7154030: java.awt.Component.hide() does not repaint parent container

Jonathan Lu luchsh at linux.vnet.ibm.com
Tue Mar 20 01:28:51 PDT 2012


Hi Artem,

Thanks for your time.

2012/3/19 Artem Ananiev <artem.ananiev at oracle.com>

> Hi, Jonathan,
>
> given the code in java.awt.Component, your statement about difference
> between hide() and setVisible(false) looks pretty strange to me. Indeed,
> here is the implementation:
>


>
>    public void show(boolean b) {
>        if (b) {
>            show();
>        } else {
>            hide();
>        }
>    }
>
> and
>
>    public void setVisible(boolean b) {
>        show(b);
>    }
>
> In JComponent the latter method is overridden and adds exactly what you
> propose: parent.repaint(). This addition makes sense for lightweight
> components (e.g. Swing), but heavyweight AWT components shouldn't require
> this: repaint request is sent from the native system.
>

Yes, lightweight and  heavyweight components differ in painting. The
original test case only works for the conditions of lightweight components,
with another test case for heavyweight components, I found that the problem
could not be reproduced on AWT any more. I think the change is only
applicable for Swing components, so how about repaint in JComponent.hide()
like this?

diff -r cdbb33303ea3 src/share/classes/javax/swing/JComponent.java
--- a/src/share/classes/javax/swing/JComponent.java    Wed Mar 14 13:50:37 2012
-0700
+++ b/src/share/classes/javax/swing/JComponent.java    Tue Mar 20 16:24:09
2012 +0800
@@ -5237,6 +5237,16 @@
         }
     }

+    public void hide() {
+        super.hide();
+        Container parent = getParent();
+        if (parent != null) {
+            Rectangle r = getBounds();
+            parent.repaint(r.x, r.y, r.width, r.height);
+            parent.invalidate();
+        }
+    }
+
     /**
      * Returns whether or not the region of the specified component is
      * obscured by a sibling.



>
> Thanks,
>
> Artem
>
>
> On 3/15/2012 12:24 PM, Jonathan Lu wrote:
>
>> Hi awt-dev,
>>
>> java.awt.Component.hide() was declared as deprecation and replaced by
>> setVisible(boolean), but in my tests, it does not works in the same way
>> as setVisible(false). The reason of this failure is that
>> java.awt.Component.hide() does not repaint the special area it used to
>> taken of parent container. Although this is deprecated method, it may
>> still valuable for customers due to compatibility reason. Bug 7154030
>> created for this issue.
>>
>> Here's a simple test case to demonstrate this problem.
>>
>> /*
>>  * Copyright (c) 2012 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.
>>  */
>>
>> /*
>>  * Portions Copyright (c) 2012 IBM Corporation
>>  */
>>
>> import javax.swing.*;
>>
>> /* @test 1.1 2012/03/15
>>    @bug 7154030
>>    @run main/manual ComponentHideShowTest.html */
>>
>> @SuppressWarnings("serial")
>> public class ComponetHideShowTest extends JFrame {
>>     JInternalFrame internalFrame;
>>     JButton btn;
>>     JDesktopPane desktop;
>>
>>     ComponetHideShowTest(String name) {
>>         super(name);
>>         desktop = new JDesktopPane();
>>         setContentPane(desktop);
>>
>>         setSize(600, 400);
>>         setVisible(true);
>>
>>         internalFrame = new JInternalFrame("Test Internal Frame");
>>         internalFrame.setSize(100, 100);
>>         internalFrame.setLocation(10, 10);
>>         internalFrame.setVisible(true)**;
>>         desktop.add(internalFrame);
>>
>>         btn = new JButton("OK");
>>         btn.setSize(100, 50);
>>         btn.setLocation( 300, 300);
>>         btn.setVisible(true);
>>         desktop.add(btn);
>>
>>         setDefaultCloseOperation(**JFrame.EXIT_ON_CLOSE);
>>     }
>>
>>     @SuppressWarnings("**deprecation")
>>     public void runTest() throws Exception {
>>         Object[] options = { "Yes, I saw it", "No, I did not see it!" };
>>
>>         int ret = JOptionPane.showOptionDialog(**this,
>> "Do you see the internal window?", "InternalFrmaeHideTest",
>>                 JOptionPane.YES_NO_OPTION,
>> JOptionPane.QUESTION_MESSAGE, null,
>>                 options, options[1]);
>>
>>         if (ret == 1 || ret == JOptionPane.CLOSED_OPTION) {
>>             throw new Exception("Failed to display internal window");
>>         }
>>
>>         internalFrame.hide();
>>         btn.hide();
>>
>>         ret = JOptionPane.showOptionDialog(**this,
>> "Do you see the internal window?", "InternalFrmaeHideTest",
>>                 JOptionPane.YES_NO_OPTION,
>> JOptionPane.QUESTION_MESSAGE, null,
>>                 options, options[1]);
>>
>>         if (ret == 0 || ret == JOptionPane.CLOSED_OPTION) {
>>             throw new Exception("Failed to hide internal window");
>>         }
>>
>>         internalFrame.show();
>>         btn.show();
>>
>>         ret = JOptionPane.showOptionDialog(**this,
>> "Do you see the internal window?", "InternalFrmaeHideTest",
>>                 JOptionPane.YES_NO_OPTION,
>> JOptionPane.QUESTION_MESSAGE, null,
>>                 options, options[1]);
>>
>>         if (ret == 1 || ret == JOptionPane.CLOSED_OPTION) {
>>             throw new Exception("Failed to hide internal window");
>>         }
>>     }
>>
>>     public static void main(String[] args) throws Exception {
>>         ComponetHideShowTest test = null;
>>         test = new ComponetHideShowTest("**InternalFrameHideTest");
>>         test.runTest();
>>     }
>> }
>>
>> And here's the patch
>> http://cr.openjdk.java.net/~**littlee/7154030/<http://cr.openjdk.java.net/%7Elittlee/7154030/>
>>
>> Can anybody please help to take a look?
>>
>> Cheers!
>> - Jonathan
>>
>
Best regards!
- Jonathan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/awt-dev/attachments/20120320/644c05cf/attachment.html 


More information about the awt-dev mailing list