package handy.swing; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; /** A JComponent that has a JSlider and a JTextField. Dragging the slider will update the text field and vice versa. */ public class SliderComponent extends JPanel { private JSlider slider; private JTextField text; /** Create a vertical SliderComponent with range bounds. @param min The minimum value of the slider. @param max The maximum value of the slider. @param value The current value of the slider. */ public SliderComponent(int min, int max, int value) { this(min, max, value, SwingConstants.VERTICAL); } /** Create a SliderComponent with range bounds. @param min The minimum value of the slider. @param max The maximum value of the slider. @param value The current value of the slider. @param orientation The orientation of the slider. Must be either {@link javax.swing.SwingConstants#VERTICAL} or {@link javax.swing.SwingConstants#HORIZONTAL} */ public SliderComponent(int min, int max, int value, int orientation) { this(new JSlider(orientation, min, max, value), new JTextField(String.valueOf(value))); } /** Create a SliderComponent with a given slider. If the slider has vertical orientation then the text field will be displayed below it, otherwise it will be to the right. @param slider The JSlider to display. */ public SliderComponent(JSlider slider) { this(slider, new JTextField(String.valueOf(slider.getValue()))); } /** Create a SliderComponent with a given slider and text field. If the slider has vertical orientation then the text field will be displayed below it, otherwise it will be to the right. @param slider The JSlider to display. @param text The JTextField to display. */ public SliderComponent(JSlider slider, JTextField text) { super(new BorderLayout()); setup(slider, text); } /** Get the JSlider component. This is useful if you want to manually set the tick marks etc. @return The JSlider component. */ public JSlider getSlider() { return slider; } /** Get the JTextField component. @return The JTextField component. */ public JTextField getTextField() { return text; } private void setup(final JSlider s, final JTextField t) { this.slider = s; this.text = t; add(slider, BorderLayout.CENTER); text.setText(String.valueOf(slider.getValue())); if (slider.getOrientation() == SwingConstants.VERTICAL) { add(text, BorderLayout.SOUTH); } else { add(text, BorderLayout.EAST); } text.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { int i = Integer.parseInt(text.getText()); slider.setValue(i); } catch (NumberFormatException ex) { // Ignore ex.printStackTrace(); } } }); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { text.setText(String.valueOf(slider.getValue())); } }); } }