6524424: JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings
Summary: JSlider should use minimal tick space in SnapToTicks mode
Reviewed-by: peterz
--- 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));
+ }
+}