Hi Artem, Thanks for your time.
2012/3/19 Artem Ananiev <artem.anan...@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