// ------------------------------------------------------------------- // AngleControl - Object representing a row (x, y or z axis), includes // a numeric readout, four buttons: < << >> > to move // the axis by 1's or 10's and a slider. // ------------------------------------------------------------------- import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JSlider; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import java.awt.FlowLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class AngleControl extends JPanel implements ActionListener, ChangeListener { private JTextField readout = null; private JButton smallIncrement = null; private JButton bigIncrement = null; private JButton smallDecrement = null; private JButton bigDecrement = null; private JSlider slider = null; private int angle = 0; private AngleChangeObserver observer = null; public AngleControl( int initialValue, String label, AngleChangeObserver observer ) { super(new FlowLayout()); this.observer = observer; angle = initialValue; readout = new JTextField(5); readout.setEditable(false); updateReadout(angle); smallIncrement = new JButton(">"); bigIncrement = new JButton(">>"); smallDecrement = new JButton("<"); bigDecrement = new JButton("<<"); smallIncrement.addActionListener(this); bigIncrement.addActionListener(this); smallDecrement.addActionListener(this); bigDecrement.addActionListener(this); slider = new JSlider(SwingConstants.HORIZONTAL, 0, 360, angle); slider.addChangeListener(this); add(new JLabel(label)); add(readout); add(smallDecrement); add(bigDecrement); add(bigIncrement); add(smallIncrement); add(slider); } public int getAngle() { return(angle); } private void updateReadout(int newValue) { readout.setText("" + newValue); observer.angleChanged(newValue); } private void updateSlider(int newValue) { slider.setValue(newValue); } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if(src == smallIncrement) angle++; else if(src == smallDecrement) angle--; else if(src == bigIncrement) angle += 10; else angle -= 10; if(angle >= 360) angle -= 360; else if(angle < 0) angle += 360; updateReadout(angle); updateSlider(angle); } public void stateChanged(ChangeEvent e) { angle = ((JSlider)e.getSource()).getValue(); updateReadout(angle); } }