6524424: JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings
authorrupashka
Wed, 30 Apr 2008 12:32:05 +0400
changeset 457 8682623ee3c3
parent 456 8ded0dbe4aaa
child 458 54413b296bdf
child 460 e12adc424b43
6524424: JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings Summary: JSlider should use minimal tick space in SnapToTicks mode Reviewed-by: peterz
jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java
jdk/test/javax/swing/JFileChooser/6524424/bug6524424.html
jdk/test/javax/swing/JFileChooser/6524424/bug6524424.java
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Tue Apr 29 17:48:01 2008 +0400
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java	Wed Apr 30 12:32:05 2008 +0400
@@ -552,20 +552,28 @@
         contentRect.height = focusRect.height - (focusInsets.top + focusInsets.bottom);
     }
 
+    private int getTickSpacing() {
+        int majorTickSpacing = slider.getMajorTickSpacing();
+        int minorTickSpacing = slider.getMinorTickSpacing();
+
+        int result;
+
+        if (minorTickSpacing > 0) {
+            result = minorTickSpacing;
+        } else if (majorTickSpacing > 0) {
+            result = majorTickSpacing;
+        } else {
+            result = 0;
+        }
+
+        return result;
+    }
+
     protected void calculateThumbLocation() {
         if ( slider.getSnapToTicks() ) {
             int sliderValue = slider.getValue();
             int snappedValue = sliderValue;
-            int majorTickSpacing = slider.getMajorTickSpacing();
-            int minorTickSpacing = slider.getMinorTickSpacing();
-            int tickSpacing = 0;
-
-            if ( minorTickSpacing > 0 ) {
-                tickSpacing = minorTickSpacing;
-            }
-            else if ( majorTickSpacing > 0 ) {
-                tickSpacing = majorTickSpacing;
-            }
+            int tickSpacing = getTickSpacing();
 
             if ( tickSpacing != 0 ) {
                 // If it's not on a tick, change the value
@@ -1273,28 +1281,34 @@
 
     public void scrollByBlock(int direction)    {
         synchronized(slider)    {
-
-            int oldValue = slider.getValue();
             int blockIncrement =
                 (slider.getMaximum() - slider.getMinimum()) / 10;
-            if (blockIncrement <= 0 &&
-                slider.getMaximum() > slider.getMinimum()) {
-
+            if (blockIncrement == 0) {
                 blockIncrement = 1;
             }
 
+            if (slider.getSnapToTicks()) {
+                int tickSpacing = getTickSpacing();
+
+                if (blockIncrement < tickSpacing) {
+                    blockIncrement = tickSpacing;
+                }
+            }
+
             int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
-            slider.setValue(oldValue + delta);
+            slider.setValue(slider.getValue() + delta);
         }
     }
 
     public void scrollByUnit(int direction) {
         synchronized(slider)    {
+            int delta = ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
 
-            int oldValue = slider.getValue();
-            int delta = 1 * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);
+            if (slider.getSnapToTicks()) {
+                delta *= getTickSpacing();
+            }
 
-            slider.setValue(oldValue + delta);
+            slider.setValue(slider.getValue() + delta);
         }
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6524424/bug6524424.html	Wed Apr 30 12:32:05 2008 +0400
@@ -0,0 +1,11 @@
+<html>
+<body>
+<applet  code="bug6524424.class" width=200 height=200></applet>
+To test fix follow the next steps:
+1. Select a slider (do the next steps for every slider)
+2. Check that the next keyboard buttons work correctly:
+    Up, Down, Left, Right, Page Up, Page Down
+3. Press left mouse button on a free space of the slider and check
+    that thumb moves correctly
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6524424/bug6524424.java	Wed Apr 30 12:32:05 2008 +0400
@@ -0,0 +1,99 @@
+/*
+ * 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 6524424
+ * @summary JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings
+ * @author Pavel Porvatov
+ * @run applet/manual=done bug6524424.html
+ */
+
+import java.awt.*;
+import javax.swing.*;
+
+import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
+
+public class bug6524424 extends JApplet {
+    public static void main(String[] args) {
+        try {
+            UIManager.setLookAndFeel(new WindowsLookAndFeel());
+        } catch (UnsupportedLookAndFeelException e) {
+            e.printStackTrace();
+
+            return;
+        }
+
+        TestPanel panel = new TestPanel();
+
+        JFrame frame = new JFrame();
+
+        frame.setContentPane(panel);
+        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+
+        frame.setVisible(true);
+    }
+
+    public void init() {
+        TestPanel panel = new TestPanel();
+
+        setContentPane(panel);
+    }
+
+    private static class TestPanel extends JPanel {
+
+        private TestPanel() {
+            super(new GridBagLayout());
+
+            JSlider slider1 = createSlider(1, 2);
+            JSlider slider2 = createSlider(2, 4);
+            JSlider slider3 = createSlider(3, 6);
+
+            addComponent(this, slider1);
+            addComponent(this, slider2);
+            addComponent(this, slider3);
+        }
+
+        private JSlider createSlider(int tickMinor, int tickMajor) {
+            JSlider result = new JSlider();
+
+            result.setPaintLabels(true);
+            result.setPaintTicks(true);
+            result.setSnapToTicks(true);
+            result.setMinimum(0);
+            result.setMaximum(12);
+            result.setMinorTickSpacing(tickMinor);
+            result.setMajorTickSpacing(tickMajor);
+
+            return result;
+        }
+    }
+
+    private static void addComponent(JPanel panel, Component component) {
+        panel.add(component, new GridBagConstraints(0,
+                panel.getComponentCount(), 1, 1,
+                1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
+                new Insets(0, 0, 0, 0), 0, 0));
+    }
+}