<Swing Dev> <AWT Dev> Review request for 7154030: java.awt.Component.hide() does not repaint parent container
Jonathan Lu
luchsh at linux.vnet.ibm.com
Thu Mar 22 05:27:30 UTC 2012
Hi Pavel,
Thanks for your explanation.
But this bug affects almost all Swing components, hide()'s presence also
helps to maintain backward compatibility, so is it possible to put a fix in
JComponent to help all the potential affected applications to work
correctly? if not, is it there any sunset plan for these deprecated APIs?
Thanks and best regards!
- Jonathan
2012/3/20 Pavel Porvatov <pavel.porvatov at oracle.com>
> Hi Jonathan,
>
> Hi Artem,
>
> 2012/3/20 Artem Ananiev <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>>
>>>
>>> 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>
>>> +++ 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> 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
>>>
>>
> Thanks a lot !
>
> - Jonathan
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20120322/c8579e08/attachment.html>
More information about the swing-dev
mailing list