Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6890942

JComboBox multiple issues with property change events for "enabled"

XMLWordPrintable

    • 6
    • x86
    • windows_xp

      FULL PRODUCT VERSION :
      java version "1.6.0_16"
      Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
      Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows XP [Version 5.1.2600]

      A DESCRIPTION OF THE PROBLEM :
      1. JComboBox.setEnabled(boolean enabled) fires twice property change event.
      This happens because the event is fired also from JComponent.setEnabled(), which is called from the overriding method.

      2. JComboBox.setEnabled(...) *always* fires property change event even when enabled status is not changed. Looking at code we see it's bypassing the "changed test" from firePropertyChange, by calling it with different values on purpose: firePropertyChange( "enabled", !isEnabled(), isEnabled() ).

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Call setEnabled(!isEnabled()) on a JComboBox after registering a property change event listener on "enabled" property.
      2. Call setEnabled(isEnabled()) on a JComboBox after registering a property change event listener on "enabled" property.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      1. Expected listener to be notified once.
      2. Expected no notification on listener.

      ACTUAL -
      1. Listener is notified twice.
      2. Listener is notified even if enabled status didn't change.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.beans.*;
      import javax.swing.*;


      public class TestJComboBoxEnabled
      {
      public static void main(String[] args)
      {
      JComboBox combo = new JComboBox();
      combo.addPropertyChangeListener("enabled", new PropertyChangeListener()
      {
      @Override
      public void propertyChange(PropertyChangeEvent evt)
      {
      System.out.println("Event fired:" + evt.getOldValue() + " -> " + evt.getNewValue());
      }
      });
      System.out.println("Enabled status is: " + combo.isEnabled());
      System.out.println("Change enabled status:");
      combo.setEnabled(!combo.isEnabled());
      System.out.println("Don't change enabled status:");
      combo.setEnabled(combo.isEnabled());
      }
      }

      ---------- END SOURCE ----------

            dnguyen Damon Nguyen
            ndcosta Nelson Dcosta (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Imported:
              Indexed: