6278700: JSlider created with BoundedRangeModel fires twice when changed
authorrupashka
Thu, 04 Sep 2008 15:15:24 +0400
changeset 1309 35d4c1f87df5
parent 1308 db0929bb4cd4
child 1310 edc39463f896
6278700: JSlider created with BoundedRangeModel fires twice when changed Summary: Removed second registration of listener Reviewed-by: peterz
jdk/src/share/classes/javax/swing/JSlider.java
jdk/test/javax/swing/JSlider/6278700/bug6278700.java
--- a/jdk/src/share/classes/javax/swing/JSlider.java	Wed Sep 03 21:00:04 2008 +0400
+++ b/jdk/src/share/classes/javax/swing/JSlider.java	Thu Sep 04 15:15:24 2008 +0400
@@ -270,8 +270,7 @@
     {
         checkOrientation(orientation);
         this.orientation = orientation;
-        sliderModel = new DefaultBoundedRangeModel(value, 0, min, max);
-        sliderModel.addChangeListener(changeListener);
+        setModel(new DefaultBoundedRangeModel(value, 0, min, max));
         updateUI();
     }
 
@@ -284,7 +283,6 @@
     {
         this.orientation = JSlider.HORIZONTAL;
         setModel(brm);
-        sliderModel.addChangeListener(changeListener);
         updateUI();
     }
 
@@ -476,15 +474,15 @@
 
         if (newModel != null) {
             newModel.addChangeListener(changeListener);
+        }
 
-            if (accessibleContext != null) {
-                accessibleContext.firePropertyChange(
-                                                    AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,
-                                                    (oldModel == null
-                                                     ? null : Integer.valueOf(oldModel.getValue())),
-                                                    (newModel == null
-                                                     ? null : Integer.valueOf(newModel.getValue())));
-            }
+        if (accessibleContext != null) {
+            accessibleContext.firePropertyChange(
+                                                AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,
+                                                (oldModel == null
+                                                 ? null : Integer.valueOf(oldModel.getValue())),
+                                                (newModel == null
+                                                 ? null : Integer.valueOf(newModel.getValue())));
         }
 
         firePropertyChange("model", oldModel, sliderModel);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSlider/6278700/bug6278700.java	Thu Sep 04 15:15:24 2008 +0400
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6278700
+ * @summary JSlider created with BoundedRangeModel fires twice when changed
+ * @author Pavel Porvatov
+   @run main bug6278700
+ */
+
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+public class bug6278700 {
+    private int changeCount;
+
+    private final ChangeListener listener = new ChangeListener() {
+        public void stateChanged(ChangeEvent e) {
+            changeCount++;
+        }
+    };
+
+    public static void main(String[] args) {
+        new bug6278700();
+    }
+
+    public bug6278700() {
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                JSlider slider = new JSlider(new DefaultBoundedRangeModel(5, 0, 0, 10));
+
+                slider.addChangeListener(listener);
+                slider.setValue(0);
+
+                if (changeCount != 1) {
+                    throw new RuntimeException("Incorrect stateChanged count: " + Integer.toString(changeCount));
+                }
+
+                changeCount = 0;
+
+                slider = new JSlider();
+
+                slider.addChangeListener(listener);
+                slider.setValue(0);
+
+                if (changeCount != 1) {
+                    throw new RuntimeException("Incorrect stateChanged count: " + Integer.toString(changeCount));
+                }
+            }
+        });
+    }
+}