<Swing Dev> <AWT Dev> Review request for 7154030: java.awt.Component.hide() does not repaint parent container
Pavel Porvatov
pavel.porvatov at oracle.com
Tue Mar 20 14:03:26 UTC 2012
Hi Jonathan,
> Hi Artem,
>
> 2012/3/20 Artem Ananiev <artem.ananiev at oracle.com
> <mailto:artem.ananiev at oracle.com>>
>
> Hi, Jonathan,
>
> I'm adding swing-dev to CC as we now consider changing Swing code.
>
> What you propose sounds technically reasonable, but I don't think
> it is worth doing anyway as show() and hide() have been deprecated
> for years now.
>
>
> Although show() and hide() have been deprecated for years, in my
> opinion supporting these APIs will still benefit many applications and
> convince users that Java still has got strong backward compatibility
> :D. Any ideas from Swing group?
I don't see why the words "backward compatibility" are here. There is a
bug in deprecated methods "show" and "hide" (I've checked that jdk5 has
the same problem), and that's one additional reason to use setVisible().
I agree with Artem that fixing deprecated API is not a high priority
task (but we should keep backward compatibility, of course). I also
think, that "to leave all as is" is a good decision for the described
problem
Regards, Pavel
>
>
> 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.ananiev at oracle.com
> <mailto:artem.ananiev at oracle.com>
> <mailto:artem.ananiev at oracle.com
> <mailto: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 <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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20120320/f26f33eb/attachment.html>
More information about the swing-dev
mailing list