From deaf84142a187d8cc7431a3d0a90c8d9cc06e29a Mon Sep 17 00:00:00 2001 From: rupashka Date: Wed, 30 Apr 2008 12:32:05 +0400 Subject: [PATCH] 6524424: JSlider Clicking In Tracks Behavior Inconsistent For Different Tick Spacings Summary: JSlider should use minimal tick space in SnapToTicks mode Reviewed-by: peterz --- .../javax/swing/plaf/basic/BasicSliderUI.java | 52 ++++++---- .../JFileChooser/6524424/bug6524424.html | 11 +++ .../JFileChooser/6524424/bug6524424.java | 99 +++++++++++++++++++ 3 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 test/javax/swing/JFileChooser/6524424/bug6524424.html create mode 100644 test/javax/swing/JFileChooser/6524424/bug6524424.java diff --git a/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 3203df334..c1aada744 100644 --- a/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -552,20 +552,28 @@ public class BasicSliderUI extends SliderUI{ 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 class BasicSliderUI extends SliderUI{ 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); } } diff --git a/test/javax/swing/JFileChooser/6524424/bug6524424.html b/test/javax/swing/JFileChooser/6524424/bug6524424.html new file mode 100644 index 000000000..ecf8f65df --- /dev/null +++ b/test/javax/swing/JFileChooser/6524424/bug6524424.html @@ -0,0 +1,11 @@ + + + +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 + + diff --git a/test/javax/swing/JFileChooser/6524424/bug6524424.java b/test/javax/swing/JFileChooser/6524424/bug6524424.java new file mode 100644 index 000000000..3952580c8 --- /dev/null +++ b/test/javax/swing/JFileChooser/6524424/bug6524424.java @@ -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)); + } +} -- GitLab