United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-5072554 Extra PropertyChange notification when vetoing a focus change event
JDK-5072554 : Extra PropertyChange notification when vetoing a focus change event

Details
Type:
Bug
Submit Date:
2004-07-09
Status:
Closed
Updated Date:
2005-12-01
Project Name:
JDK
Resolved Date:
2004-10-11
Component:
client-libs
OS:
windows_nt
Sub-Component:
java.awt
CPU:
x86
Priority:
P4
Resolution:
Fixed
Affected Versions:
1.4.0
Fixed Versions:

Related Reports

Sub Tasks

Description
I have a test application (attached as FocusChangeTest.java) that has two JTextFields. I've added a VetoableChangeListener to the KeyboardFocusManager to veto any focus change that would put focus on the second JTextField. It also prints out the old and new values in the PropertyChangeEvent.

Upon launching the application, the following is printed to the console, as the first text field gains focus:

0 Old=null, New=One

After hitting TAB, the following is printed out.

1 Old=One, New=null
2 Old=null, New=Two
VETOING
3 Old=Two, New=null
4 Old=null, New=null
5 Old=null, New=One

Line is quite odd and doesn't really make sense. Seems like a bug to me.

                                    

Comments
EVALUATION

Name: aaR10319			Date: 07/15/2004

in the application listed focus events are:

1. at startup - FOCUS_GAINED on "One" (opposite is null)
2. when user hits Tab - FOCUS_LOST on "One" (opposite is "Two"), after 
it focusOwner and permanentFocusOwner become null
3. FOCUS_GAINED on "Two" (opposite is "One") - that is vetoed, so 
focusOwner becomes "One" and permanentFocusOwner = null
4. because of veto - FOCUS_LOST on "Two" (opposite is One), focusOwner 
and permanentFocusOwner become null
5. FOCUS_GAINED on "One" (opposite is "Two"), focusOwner and 
permanentFocusOwner become "One"

All the changes to permanentFocusOwner property cause user notification, 
so in the 4. notification will be the vetoableChange with both old and 
new values set null.

As a possible solution we probably should not generate vetoable 
PropertyChangeEvent if old and new values are equal. And users would 
better veto either both focusOwner and permanentFocusOwner properties or 
none of them, though this is not a requirement

###@###.###

======================================================================

Name: at153223			Date: 07/26/2004

The problem is that the case when old and new property values are null
is considered by PropertyChangeSupport class to require notification.
Though in case of focusOwner property we don't have to be notified.

###@###.###  07/26/2004


======================================================================

Name: at153223			Date: 07/28/2004


Suggested fix (see also Artem's evaluation above) is to test if an old and
new property values are the same ('null' and 'null' case is included) not relying
on PropertyChangeSupport checking.

###@###.###   07/28/2004


======================================================================
                                     
2004-07-28
SUGGESTED FIX

------- KeyboardFocusManager.java -------
*** /tmp/sccs.R2aqSo	Wed Jul 28 19:22:11 2004
--- KeyboardFocusManager.java	Wed Jul 28 12:53:07 2004
***************
*** 1369,1379 ****
       * @param propertyName the name of the property that has changed
       * @param oldValue the property's previous value
       * @param newValue the property's new value
       */
      protected void firePropertyChange(String propertyName, Object oldValue,
!                                       Object newValue) {
          PropertyChangeSupport changeSupport = this.changeSupport;
          if (changeSupport != null) {
  	    changeSupport.firePropertyChange(propertyName, oldValue, newValue);
  	}
      }
--- 1369,1383 ----
       * @param propertyName the name of the property that has changed
       * @param oldValue the property's previous value
       * @param newValue the property's new value
       */
      protected void firePropertyChange(String propertyName, Object oldValue,
!                                       Object newValue)
!     {
!         if (oldValue == newValue) {
!             return;
!         }
          PropertyChangeSupport changeSupport = this.changeSupport;
          if (changeSupport != null) {
  	    changeSupport.firePropertyChange(propertyName, oldValue, newValue);
  	}
      }
***************
*** 1545,1554 ****
--- 1549,1561 ----
       */
      protected void fireVetoableChange(String propertyName, Object oldValue,
                                        Object newValue)
  	throws PropertyVetoException
      {
+         if (oldValue == newValue) {
+             return;
+         }
          VetoableChangeSupport vetoableSupport =
  	    this.vetoableSupport;
          if (vetoableSupport != null) {
  	    vetoableSupport.fireVetoableChange(propertyName, oldValue,
  					       newValue);

###@###.### 08/13/2004
###@###.### 2004-08-13
                                     
2004-08-13
CONVERTED DATA

BugTraq+ Release Management Values

COMMIT TO FIX:
mustang

FIXED IN:
mustang


                                     
2004-09-11



Hardware and Software, Engineered to Work Together