/* * 1.1 version. */ import java.awt.*; import java.awt.event.*; import java.util.*; import java.applet.Applet; public class ConversionPanel extends Panel implements ActionListener, AdjustmentListener, ItemListener { TextField textField; Choice unitChooser; Scrollbar slider; int max = 10000; int block = 100; Converter controller; Unit[] units; ConversionPanel(Converter myController, String myTitle, Unit[] myUnits) { //Initialize this ConversionPanel to use a GridBagLayout. GridBagConstraints c = new GridBagConstraints(); GridBagLayout gridbag = new GridBagLayout(); setLayout(gridbag); //Save arguments in instance variables. controller = myController; units = myUnits; //Set up default layout constraints. c.fill = GridBagConstraints.HORIZONTAL; //Add the label. It displays this panel's title, centered. Label label = new Label(myTitle, Label.CENTER); c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. gridbag.setConstraints(label, c); add(label); //Add the text field. It initially displays "0" and needs //to be at least 10 columns wide. textField = new TextField("0", 10); c.weightx = 1.0; //Use maximum horizontal space... c.gridwidth = 1; //The default value. gridbag.setConstraints(textField, c); add(textField); textField.addActionListener(this); //Add the pop-up list (Choice). unitChooser = new Choice(); for (int i = 0; i < units.length; i++) { //Populate it. unitChooser.add(units[i].description); } c.weightx = 0.0; //The default value. c.gridwidth = GridBagConstraints.REMAINDER; //End a row. gridbag.setConstraints(unitChooser, c); add(unitChooser); unitChooser.addItemListener(this); //Add the slider. It's horizontal, and it has the maximum //value specified by the instance variable max. Its initial //and minimum values are the default (0). A click increments //the value by block units. slider = new Scrollbar(Scrollbar.HORIZONTAL); slider.setMaximum(max + 10); slider.setBlockIncrement(block); c.gridwidth = 1; //The default value. gridbag.setConstraints(slider, c); add(slider); slider.addAdjustmentListener(this); } /** * Returns the multiplier (units/meter) for the currently * selected unit of measurement. */ double getMultiplier() { int i = unitChooser.getSelectedIndex(); return units[i].multiplier; } /** Draws a box around this panel. */ public void paint(Graphics g) { Dimension d = getSize(); g.drawRect(0,0, d.width - 1, d.height - 1); } /** * Puts a little breathing space between * the panel and its contents, which lets us draw a box * in the paint() method. * We add more pixels to the right, to work around a * Choice bug. */ public Insets getInsets() { return new Insets(5,5,5,8); } /** * Gets the current value in the text field. * It's guaranteed to be the same as the value * in the scroller (subject to rounding, of course). */ double getValue() { double f; try { f = (double)Double.valueOf(textField.getText()).doubleValue(); } catch (java.lang.NumberFormatException e) { f = 0.0; } return f; } public void actionPerformed(ActionEvent e) { setSliderValue(getValue()); controller.convert(this); } public void itemStateChanged(ItemEvent e) { controller.convert(this); } /** Respond to the slider. */ public void adjustmentValueChanged(AdjustmentEvent e) { textField.setText(String.valueOf(e.getValue())); controller.convert(this); } /** Set the values in the slider and text field. */ void setValue(double f) { setSliderValue(f); textField.setText(String.valueOf((float)f)); } /** Set the slider value. */ void setSliderValue(double f) { int sliderValue = (int)f; if (sliderValue > max) sliderValue = max; if (sliderValue < 0) sliderValue = 0; slider.setValue(sliderValue); } }