samer@1: /* samer@1: * 1.1+Swing version. samer@1: */ samer@1: samer@1: import javax.swing.*; samer@1: import javax.swing.event.*; samer@1: import java.awt.*; samer@1: import java.awt.event.*; samer@1: import java.util.*; samer@1: import java.text.NumberFormat; samer@1: samer@1: public class ConversionPanel extends JPanel { samer@1: DecimalField textField; samer@1: JComboBox unitChooser; samer@1: JSlider slider; samer@1: ConverterRangeModel sliderModel; samer@1: Converter controller; samer@1: Unit[] units; samer@1: String title; samer@1: final static boolean DEBUG = false; samer@1: final static boolean COLORS = false; samer@1: final static int MAX = 10000; samer@1: samer@1: ConversionPanel(Converter myController, String myTitle, samer@1: Unit[] myUnits, samer@1: ConverterRangeModel myModel) { samer@1: if (COLORS) { samer@1: setBackground(Color.cyan); samer@1: } samer@1: setBorder(BorderFactory.createCompoundBorder( samer@1: BorderFactory.createTitledBorder(myTitle), samer@1: BorderFactory.createEmptyBorder(5,5,5,5))); samer@1: samer@1: //Save arguments in instance variables. samer@1: controller = myController; samer@1: units = myUnits; samer@1: title = myTitle; samer@1: sliderModel = myModel; samer@1: samer@1: //Add the text field. It initially displays "0" and needs samer@1: //to be at least 10 columns wide. samer@1: NumberFormat numberFormat = NumberFormat.getNumberInstance(); samer@1: numberFormat.setMaximumFractionDigits(2); samer@1: textField = new DecimalField(0, 10, numberFormat); samer@1: textField.setValue(sliderModel.getDoubleValue()); samer@1: textField.addActionListener(new ActionListener() { samer@1: public void actionPerformed(ActionEvent e) { samer@1: sliderModel.setDoubleValue(textField.getValue()); samer@1: } samer@1: }); samer@1: samer@1: //Add the combo box. samer@1: unitChooser = new JComboBox(); samer@1: for (int i = 0; i < units.length; i++) { //Populate it. samer@1: unitChooser.addItem(units[i].description); samer@1: } samer@1: unitChooser.setSelectedIndex(0); samer@1: sliderModel.setMultiplier(units[0].multiplier); samer@1: unitChooser.addActionListener(new ActionListener() { samer@1: public void actionPerformed(ActionEvent e) { samer@1: //Set new maximums for the sliders. samer@1: int i = unitChooser.getSelectedIndex(); samer@1: sliderModel.setMultiplier(units[i].multiplier); samer@1: controller.resetMaxValues(false); samer@1: } samer@1: }); samer@1: samer@1: //Add the slider. samer@1: slider = new JSlider(sliderModel); samer@1: sliderModel.addChangeListener(new ChangeListener() { samer@1: public void stateChanged(ChangeEvent e) { samer@1: textField.setValue(sliderModel.getDoubleValue()); samer@1: } samer@1: }); samer@1: samer@1: //Make the textfield/slider group a fixed size. samer@1: JPanel unitGroup = new JPanel() { samer@1: public Dimension getMinimumSize() { samer@1: return getPreferredSize(); samer@1: } samer@1: public Dimension getPreferredSize() { samer@1: return new Dimension(150, samer@1: super.getPreferredSize().height); samer@1: } samer@1: public Dimension getMaximumSize() { samer@1: return getPreferredSize(); samer@1: } samer@1: }; samer@1: if (COLORS) { samer@1: unitGroup.setBackground(Color.blue); samer@1: } samer@1: unitGroup.setBorder(BorderFactory.createEmptyBorder( samer@1: 0,0,0,5)); samer@1: unitGroup.setLayout(new BoxLayout(unitGroup, samer@1: BoxLayout.Y_AXIS)); samer@1: unitGroup.add(textField); samer@1: unitGroup.add(slider); samer@1: samer@1: setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); samer@1: add(unitGroup); samer@1: add(unitChooser); samer@1: unitGroup.setAlignmentY(TOP_ALIGNMENT); samer@1: unitChooser.setAlignmentY(TOP_ALIGNMENT); samer@1: } samer@1: samer@1: /** samer@1: * Returns the multiplier (units/meter) for the currently samer@1: * selected unit of measurement. samer@1: */ samer@1: public double getMultiplier() { samer@1: return sliderModel.getMultiplier(); samer@1: } samer@1: samer@1: public double getValue() { samer@1: return sliderModel.getDoubleValue(); samer@1: } samer@1: }