Trouble setting JSlider position
Hello everyone,
I have been playing with jsliders for a while now, and have never had
any trouble positioning sliders where I want in response to particular
events. I am running into trouble right now though, where I want to
prevent one slider from passing below the value of another slider.
I have written a simple program which demonstrates this problem. The
program displays two sliders (only listens to second slider). If I
move the second slider below the first slider and release it,
- it shows the proper portion of code has been reached;
- it shows the lower bound has been read correctly;
- it shows that the value of the slider has been reset properly;
- problem: as soon as the slider value is adjusted by the program, it
goes right back to where the user had set it.
I am guessing the problem is in the checkSliderBounds method, but maybe
it's in the stateChanged method. Any thoughts?
import javax.swing.*;
import javax.swing.event.*;
public class SliderSnapTester extends JFrame implements ChangeListener
{
JSlider sliderOne;
JSlider sliderTwo;
JTextField sliderOneDisplay = new JTextField(3);
JTextField sliderTwoDisplay = new JTextField(3);
public SliderSnapTester() {
super("Slider Snap Tester");
setSize(500, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// Container panel for whole frame.
JPanel wholePanel = new JPanel();
BoxLayout wholePanelLayout = new BoxLayout(wholePanel,
BoxLayout.Y_AXIS);
wholePanel.setLayout(wholePanelLayout);
// Build Sliders
buildSliders();
// Build panels for each row.
JPanel sliderOnePanel = new JPanel();
BoxLayout sliderOnePanelLayout = new BoxLayout(sliderOnePanel,
BoxLayout.X_AXIS);
sliderOnePanel.setLayout(sliderOnePanelLayout);
sliderOnePanel.add(sliderOne);
sliderOnePanel.add(sliderOneDisplay);
JPanel sliderTwoPanel = new JPanel();
BoxLayout sliderTwoPanelLayout = new BoxLayout(sliderTwoPanel,
BoxLayout.X_AXIS);
sliderTwoPanel.setLayout(sliderTwoPanelLayout);
sliderTwoPanel.add(sliderTwo);
sliderTwoPanel.add(sliderTwoDisplay);
// Build whole panel.
wholePanel.add(sliderOnePanel);
wholePanel.add(sliderTwoPanel);
// Initialize displays.
sliderOneDisplay.setText("" + sliderOne.getValue() );
sliderTwoDisplay.setText("" + sliderTwo.getValue() );
add(wholePanel);
setVisible(true);
} // END SliderSnapTester()
public void stateChanged(ChangeEvent evt) {
JSlider sliderChanged = (JSlider)evt.getSource();
if ( sliderChanged == sliderTwo &&
!sliderChanged.getValueIsAdjusting() ) {
checkSliderBounds();
}
} // END stateChanged(ChangeEvent evt)
private void checkSliderBounds() {
int sliderTwoValue = sliderTwo.getValue();
int lowerBound = sliderOne.getValue() + 1; // Lowest allowed value
for slider two.
if (sliderTwoValue < lowerBound) {
sliderTwo.setValue(lowerBound);
JOptionPane.showMessageDialog(null, "lowerBound: " + lowerBound);
}
sliderTwoDisplay.setText("" + sliderTwoValue);
} // END checkSliderBounds()
private void buildSliders() {
sliderOne = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
sliderTwo = new JSlider(JSlider.HORIZONTAL, 0, 100, 75);
sliderOne.setMajorTickSpacing(25);
sliderOne.setMinorTickSpacing(5);
sliderOne.setPaintTicks(true);
sliderOne.setPaintLabels(true);
sliderTwo.setMajorTickSpacing(25);
sliderTwo.setMinorTickSpacing(5);
sliderTwo.setPaintTicks(true);
sliderTwo.setPaintLabels(true);
sliderOne.addChangeListener(this);
sliderTwo.addChangeListener(this);
} // END buildSliders()
public static void main(String[] arguments) {
SliderSnapTester sliderSnapTester = new SliderSnapTester();
}
}