-
Bug
-
Resolution: Fixed
-
P4
-
6, 6u1
-
b27
-
x86
-
linux, windows_xp
-
Not verified
FULL PRODUCT VERSION :
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Linux coco-laptop 2.6.17-11-generic #2 SMP Thu Feb 1 19:52:28 UTC 2007 i686 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
JSlider allows clicking in the "track" and using the arrow and page up/down keys to move the sliders. This behavior is inconsistent based on the particular values of minorTickSpacing and
majorTickSpacing.
It appears that the home and end keys always work, but the arrows, page up and down, and clicking with the mouse is partly broken when the tick spacing is set to some kinds of ranges.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the test program to see 3 sliders that behave differently.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The sliders should all respond to clicking and arrow and page up/down keys, by snapping incrementally to adjacent ticks.
ACTUAL -
The slider with default values responds as expected. Sliders with other values do not move in one or both directions when clicked.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
The program compiles and runs normally.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/* SliderTickTest.java
* Created on: February 3, 2007
* ###@###.###
*/
/** Clicking on JSlider tracks behaves inconsistently. */
public class SliderTickTest extends javax.swing.JFrame {
/** Shows a frame with 3 sliders for testing. */
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SliderTickTest().setVisible(true);
}
});
}
/** Constructor. */
public SliderTickTest() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
final javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
final javax.swing.JPanel southPanel = new javax.swing.JPanel();
final javax.swing.JLabel jLabel3 = new javax.swing.JLabel();
final javax.swing.JComboBox jComboBox2 = new javax.swing.JComboBox();
final javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
final javax.swing.JComboBox jComboBox1 = new javax.swing.JComboBox();
getContentPane().setLayout(new java.awt.BorderLayout(0, 12));
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText("Click in the tracks in both directions. Note the major and minor tick spacings.");
getContentPane().add(jLabel1, java.awt.BorderLayout.NORTH);
centerPanel.setLayout(new javax.swing.BoxLayout(centerPanel, javax.swing.BoxLayout.PAGE_AXIS));
jSlider1.setMajorTickSpacing(2);
jSlider1.setMaximum(12);
jSlider1.setMinorTickSpacing(1);
jSlider1.setPaintLabels(true);
jSlider1.setPaintTicks(true);
jSlider1.setSnapToTicks(true);
jSlider1.setValue(0);
centerPanel.add(jSlider1);
jSlider2.setMajorTickSpacing(4);
jSlider2.setMaximum(12);
jSlider2.setMinorTickSpacing(2);
jSlider2.setPaintLabels(true);
jSlider2.setPaintTicks(true);
jSlider2.setSnapToTicks(true);
jSlider2.setValue(0);
centerPanel.add(jSlider2);
jSlider3.setMajorTickSpacing(6);
jSlider3.setMaximum(12);
jSlider3.setMinorTickSpacing(3);
jSlider3.setPaintLabels(true);
jSlider3.setPaintTicks(true);
jSlider3.setSnapToTicks(true);
jSlider3.setValue(0);
centerPanel.add(jSlider3);
getContentPane().add(centerPanel, java.awt.BorderLayout.CENTER);
southPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 6, 0));
jLabel3.setLabelFor(jComboBox2);
jLabel3.setText("Slider Orientation:");
southPanel.add(jLabel3);
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Horizontal", "Vertical" }));
jComboBox2.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
orientSliders(evt);
}
});
southPanel.add(jComboBox2);
jLabel2.setLabelFor(jComboBox1);
jLabel2.setText("LookAndFeel:");
southPanel.add(jLabel2);
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "System", "Ocean", "Metal" }));
jComboBox1.setSelectedIndex(1);
jComboBox1.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
changeLAF(evt);
}
});
southPanel.add(jComboBox1);
getContentPane().add(southPanel, java.awt.BorderLayout.SOUTH);
pack();
}// </editor-fold>
private void orientSliders(java.awt.event.ItemEvent evt) {
if (evt.getStateChange() != java.awt.event.ItemEvent.SELECTED) return;
if (evt.getItem().equals("Horizontal")) {
jSlider1.setOrientation(javax.swing.JSlider.HORIZONTAL);
jSlider2.setOrientation(javax.swing.JSlider.HORIZONTAL);
jSlider3.setOrientation(javax.swing.JSlider.HORIZONTAL);
final javax.swing.BoxLayout centerLayout
= new javax.swing.BoxLayout(
centerPanel,
javax.swing.BoxLayout.PAGE_AXIS);
centerPanel.setLayout(centerLayout);
} else if (evt.getItem().equals("Vertical")) {
jSlider1.setOrientation(javax.swing.JSlider.VERTICAL);
jSlider2.setOrientation(javax.swing.JSlider.VERTICAL);
jSlider3.setOrientation(javax.swing.JSlider.VERTICAL);
final javax.swing.BoxLayout centerLayout
= new javax.swing.BoxLayout(
centerPanel,
javax.swing.BoxLayout.LINE_AXIS);
centerPanel.setLayout(centerLayout);
}
pack();
}
private void changeLAF(java.awt.event.ItemEvent evt) {
if (evt.getStateChange() != java.awt.event.ItemEvent.SELECTED) return;
try {
if (evt.getItem().equals("System"))
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getSystemLookAndFeelClassName());
else if (evt.getItem().equals("Ocean")) {
javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(
new javax.swing.plaf.metal.OceanTheme());
javax.swing.UIManager.setLookAndFeel(
new javax.swing.plaf.metal.MetalLookAndFeel());
} else if (evt.getItem().equals("Metal")) {
javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(
new javax.swing.plaf.metal.DefaultMetalTheme());
javax.swing.UIManager.setLookAndFeel(
new javax.swing.plaf.metal.MetalLookAndFeel());
}
javax.swing.SwingUtilities.updateComponentTreeUI(this);
pack();
} catch (final Exception ex) { ex.printStackTrace(); }
}
// Variables declaration - do not modify
private final javax.swing.JPanel centerPanel = new javax.swing.JPanel();
private final javax.swing.JSlider jSlider1 = new javax.swing.JSlider();
private final javax.swing.JSlider jSlider2 = new javax.swing.JSlider();
private final javax.swing.JSlider jSlider3 = new javax.swing.JSlider();
// End of variables declaration
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I haven't implemented a workaround: it seems a bit involved -- since mouse handling must be modified it probably requires a patch on the component's method implementations.
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Linux coco-laptop 2.6.17-11-generic #2 SMP Thu Feb 1 19:52:28 UTC 2007 i686 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
JSlider allows clicking in the "track" and using the arrow and page up/down keys to move the sliders. This behavior is inconsistent based on the particular values of minorTickSpacing and
majorTickSpacing.
It appears that the home and end keys always work, but the arrows, page up and down, and clicking with the mouse is partly broken when the tick spacing is set to some kinds of ranges.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute the test program to see 3 sliders that behave differently.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The sliders should all respond to clicking and arrow and page up/down keys, by snapping incrementally to adjacent ticks.
ACTUAL -
The slider with default values responds as expected. Sliders with other values do not move in one or both directions when clicked.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
The program compiles and runs normally.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/* SliderTickTest.java
* Created on: February 3, 2007
* ###@###.###
*/
/** Clicking on JSlider tracks behaves inconsistently. */
public class SliderTickTest extends javax.swing.JFrame {
/** Shows a frame with 3 sliders for testing. */
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SliderTickTest().setVisible(true);
}
});
}
/** Constructor. */
public SliderTickTest() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
final javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
final javax.swing.JPanel southPanel = new javax.swing.JPanel();
final javax.swing.JLabel jLabel3 = new javax.swing.JLabel();
final javax.swing.JComboBox jComboBox2 = new javax.swing.JComboBox();
final javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
final javax.swing.JComboBox jComboBox1 = new javax.swing.JComboBox();
getContentPane().setLayout(new java.awt.BorderLayout(0, 12));
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText("Click in the tracks in both directions. Note the major and minor tick spacings.");
getContentPane().add(jLabel1, java.awt.BorderLayout.NORTH);
centerPanel.setLayout(new javax.swing.BoxLayout(centerPanel, javax.swing.BoxLayout.PAGE_AXIS));
jSlider1.setMajorTickSpacing(2);
jSlider1.setMaximum(12);
jSlider1.setMinorTickSpacing(1);
jSlider1.setPaintLabels(true);
jSlider1.setPaintTicks(true);
jSlider1.setSnapToTicks(true);
jSlider1.setValue(0);
centerPanel.add(jSlider1);
jSlider2.setMajorTickSpacing(4);
jSlider2.setMaximum(12);
jSlider2.setMinorTickSpacing(2);
jSlider2.setPaintLabels(true);
jSlider2.setPaintTicks(true);
jSlider2.setSnapToTicks(true);
jSlider2.setValue(0);
centerPanel.add(jSlider2);
jSlider3.setMajorTickSpacing(6);
jSlider3.setMaximum(12);
jSlider3.setMinorTickSpacing(3);
jSlider3.setPaintLabels(true);
jSlider3.setPaintTicks(true);
jSlider3.setSnapToTicks(true);
jSlider3.setValue(0);
centerPanel.add(jSlider3);
getContentPane().add(centerPanel, java.awt.BorderLayout.CENTER);
southPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 6, 0));
jLabel3.setLabelFor(jComboBox2);
jLabel3.setText("Slider Orientation:");
southPanel.add(jLabel3);
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Horizontal", "Vertical" }));
jComboBox2.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
orientSliders(evt);
}
});
southPanel.add(jComboBox2);
jLabel2.setLabelFor(jComboBox1);
jLabel2.setText("LookAndFeel:");
southPanel.add(jLabel2);
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "System", "Ocean", "Metal" }));
jComboBox1.setSelectedIndex(1);
jComboBox1.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
changeLAF(evt);
}
});
southPanel.add(jComboBox1);
getContentPane().add(southPanel, java.awt.BorderLayout.SOUTH);
pack();
}// </editor-fold>
private void orientSliders(java.awt.event.ItemEvent evt) {
if (evt.getStateChange() != java.awt.event.ItemEvent.SELECTED) return;
if (evt.getItem().equals("Horizontal")) {
jSlider1.setOrientation(javax.swing.JSlider.HORIZONTAL);
jSlider2.setOrientation(javax.swing.JSlider.HORIZONTAL);
jSlider3.setOrientation(javax.swing.JSlider.HORIZONTAL);
final javax.swing.BoxLayout centerLayout
= new javax.swing.BoxLayout(
centerPanel,
javax.swing.BoxLayout.PAGE_AXIS);
centerPanel.setLayout(centerLayout);
} else if (evt.getItem().equals("Vertical")) {
jSlider1.setOrientation(javax.swing.JSlider.VERTICAL);
jSlider2.setOrientation(javax.swing.JSlider.VERTICAL);
jSlider3.setOrientation(javax.swing.JSlider.VERTICAL);
final javax.swing.BoxLayout centerLayout
= new javax.swing.BoxLayout(
centerPanel,
javax.swing.BoxLayout.LINE_AXIS);
centerPanel.setLayout(centerLayout);
}
pack();
}
private void changeLAF(java.awt.event.ItemEvent evt) {
if (evt.getStateChange() != java.awt.event.ItemEvent.SELECTED) return;
try {
if (evt.getItem().equals("System"))
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getSystemLookAndFeelClassName());
else if (evt.getItem().equals("Ocean")) {
javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(
new javax.swing.plaf.metal.OceanTheme());
javax.swing.UIManager.setLookAndFeel(
new javax.swing.plaf.metal.MetalLookAndFeel());
} else if (evt.getItem().equals("Metal")) {
javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(
new javax.swing.plaf.metal.DefaultMetalTheme());
javax.swing.UIManager.setLookAndFeel(
new javax.swing.plaf.metal.MetalLookAndFeel());
}
javax.swing.SwingUtilities.updateComponentTreeUI(this);
pack();
} catch (final Exception ex) { ex.printStackTrace(); }
}
// Variables declaration - do not modify
private final javax.swing.JPanel centerPanel = new javax.swing.JPanel();
private final javax.swing.JSlider jSlider1 = new javax.swing.JSlider();
private final javax.swing.JSlider jSlider2 = new javax.swing.JSlider();
private final javax.swing.JSlider jSlider3 = new javax.swing.JSlider();
// End of variables declaration
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I haven't implemented a workaround: it seems a bit involved -- since mouse handling must be modified it probably requires a patch on the component's method implementations.
- duplicates
-
JDK-6463630 JSlider - keyboard controls do not work if setSnapToTicks was invoked
-
- Closed
-