Even if we accept the change in JComponent.hide(), we should then
override show() as well (lightweight component may be non-opaque,
so we should repaint from its parent), so there will be code
duplication. This is one more reason to leave all as is.
Yes, I noticed that code duplication too and am trying to make a more
compact patch for this problem.
This is my personal opinion, I'm not a Swing expert, though. Let
anyone from the Swing group comment.
Thanks,
Artem
On 3/20/2012 12:28 PM, Jonathan Lu wrote:
Hi Artem,
Thanks for your time.
2012/3/19 Artem Ananiev <artem.anan...@oracle.com
<mailto:artem.anan...@oracle.com>
<mailto:artem.anan...@oracle.com
<mailto: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 <tel:2012%20-0700> <tel:2012%20-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 <http://www.oracle.com>
<http://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/%7E__littlee/7154030/>
<http://cr.openjdk.java.net/%7Elittlee/7154030/>
Can anybody please help to take a look?
Cheers!
- Jonathan
Best regards!
- Jonathan
Thanks a lot !
- Jonathan