import java.applet.*; import java.awt.*; import java.awt.event.*; /** * Converts U.S units to SI units. * http://www.ibluemojo.com * @author H.Joon Kim */ public class UnitConverter extends Applet implements ActionListener, ItemListener { // Array of ratio/factors between units private double factorArray[]; private boolean complex; // Interface components private Panel radio, field; private TextField input, output; private Button convert; private Label toLabel, status; private Checkbox area, energy, pressure, length, velocity, volume, weight, temperature; private CheckboxGroup units; private Choice inputChoice, outputChoice; /** * Initialize the applet. */ public void init() { setSize(380, 220); super.init(); this.setLayout(null); this.setBackground(new Color(221, 238, 255)); radio = new Panel(new FlowLayout()); field = new Panel(new GridLayout(2, 3, 5, 10)); input = new TextField("1", 10); output = new TextField(10); convert = new Button("Convert!"); toLabel = new Label("To", Label.CENTER); status = new Label(); output.setEditable(false); output.setBackground(new Color(255, 255, 223)); units = new CheckboxGroup(); area = new Checkbox("Area", units, false); energy = new Checkbox("Energy", units, false); length = new Checkbox("Length", units, true); pressure = new Checkbox("Pressure", units, false); velocity = new Checkbox("Velocity", units, false); volume = new Checkbox("Volume", units, false); weight = new Checkbox("Weight", units, false); temperature = new Checkbox("Temperature", units, false); // Add components to event listeners convert.addActionListener(this); area.addItemListener(this); energy.addItemListener(this); length.addItemListener(this); pressure.addItemListener(this); velocity.addItemListener(this); volume.addItemListener(this); weight.addItemListener(this); temperature.addItemListener(this); inputChoice = new Choice(); outputChoice = new Choice(); inputChoice.setFont(new Font("", Font.PLAIN, 12)); outputChoice.setFont(new Font("", Font.PLAIN, 12)); // Set the default list with Choices for 'length' factorArray = lengthFactor(); inputChoice.add("US: inch"); inputChoice.add("US: feet"); inputChoice.add("US: yard"); inputChoice.add("US: mile"); inputChoice.add("SI: mm"); inputChoice.add("SI: cm"); inputChoice.add("SI: m"); inputChoice.add("SI: km"); outputChoice.add("US: inch"); outputChoice.add("US: feet"); outputChoice.add("US: yard"); outputChoice.add("US: mile"); outputChoice.add("SI: mm"); outputChoice.add("SI: cm"); outputChoice.add("SI: m"); outputChoice.add("SI: km"); // Add Checkboxes to their panels radio.add(length); radio.add(weight); radio.add(velocity); radio.add(area); radio.add(volume); radio.add(temperature); radio.add(energy); radio.add(pressure); field.add(input); field.add(convert); field.add(output); field.add(inputChoice); field.add(toLabel); field.add(outputChoice); // Set the locations of interface comps. radio.setBounds(0, 45, 350, 60); field.setBounds(10, 110, 350, 60); status.setBounds(10, 180, 250, 30); // Add Panels and Labels to the applet this.add(radio); this.add(field); this.add(status); } /** * Perform converting units. */ public void actionPerformed(ActionEvent e) { try { // Obtain the base input value String baseStr = input.getText(); Double baseRaw = new Double(baseStr); double base = baseRaw.doubleValue(); // Get index of selected units and assign them the respective // converting factor on the factor[] array. int inputIndex = inputChoice.getSelectedIndex(); int outputIndex = outputChoice.getSelectedIndex(); if (complex) { double converted = doComplexConversion(base, inputIndex, outputIndex); output.setText("" + converted); status.setText(""); } else { double inputFactor = factorArray[inputIndex]; double outputFactor = factorArray[outputIndex]; // Convert the input double factor = inputFactor / outputFactor; double converted = base * factor; output.setText("" + converted); status.setText(""); } } //check for valid input (numbers) catch (NumberFormatException nfe) { status.setText("Error : You must input a number."); input.setText(""); } } /** * Change the item state of the drop-down menu, depending on the choice of * the type of units. */ public void itemStateChanged(ItemEvent e) { // Check for selected radio button Checkbox cb = (Checkbox)(e.getItemSelectable()); output.setText(""); inputChoice.removeAll(); outputChoice.removeAll(); //assign Choice values depending on selected Checkbox if (cb == area) { complex = false; // Assign appropriate factors factorArray = areaFactor(); inputChoice.add("US: inch"); inputChoice.add("US: feet"); inputChoice.add("US: yard"); inputChoice.add("US: mile"); inputChoice.add("SI: cm"); inputChoice.add("SI: m"); inputChoice.add("SI: acre"); inputChoice.add("SI: km"); outputChoice.add("US: inch"); outputChoice.add("US: feet"); outputChoice.add("US: yard"); outputChoice.add("US: mile"); outputChoice.add("SI: cm"); outputChoice.add("SI: m"); outputChoice.add("SI: acre"); outputChoice.add("SI: km"); } else if (cb == energy) { complex = false; // Assign appropriate factors factorArray = energyFactor(); inputChoice.add("US: in*lbf"); inputChoice.add("US: ft*lbf"); inputChoice.add("US: Btu's"); inputChoice.add("US: kcal"); inputChoice.add("SI: Joules"); inputChoice.add("SI: kw-hours"); inputChoice.add("SI: hp"); outputChoice.add("US: in*lbf"); outputChoice.add("US: ft*lbf"); outputChoice.add("US: Btu's"); outputChoice.add("US: kcal"); outputChoice.add("SI: Joules"); outputChoice.add("SI: kw-hours"); outputChoice.add("SI: hp"); } else if (cb == length) { complex = false; // Assign appropriate factors factorArray = lengthFactor(); inputChoice.add("US: inch"); inputChoice.add("US: feet"); inputChoice.add("US: yard"); inputChoice.add("US: mile"); inputChoice.add("SI: mm"); inputChoice.add("SI: cm"); inputChoice.add("SI: m"); inputChoice.add("SI: km"); outputChoice.add("US: inch"); outputChoice.add("US: feet"); outputChoice.add("US: yard"); outputChoice.add("US: mile"); outputChoice.add("SI: mm"); outputChoice.add("SI: cm"); outputChoice.add("SI: m"); outputChoice.add("SI: km"); } else if (cb == pressure) { complex = false; // Assign appropriate factors factorArray = pressureFactor(); inputChoice.add("US: psi"); inputChoice.add("US: psf"); inputChoice.add("US: mmHg, Torr"); inputChoice.add("US: atmospheres"); inputChoice.add("SI: Pascals"); inputChoice.add("SI: microbar"); inputChoice.add("SI: millibar"); inputChoice.add("SI: bar"); inputChoice.add("SI: N/sq. mm."); outputChoice.add("US: psi"); outputChoice.add("US: psf"); outputChoice.add("US: mmHg, Torr"); outputChoice.add("US: atmospheres"); outputChoice.add("SI: Pascals"); outputChoice.add("SI: microbar"); outputChoice.add("SI: millibar"); outputChoice.add("SI: bar"); outputChoice.add("SI: N/sq. mm."); } else if (cb == velocity) { complex = false; // Assign appropriate factors factorArray = velocityFactor(); inputChoice.add("US: mph"); inputChoice.add("US: knots"); inputChoice.add("SI: km/h"); inputChoice.add("SI: m/s"); outputChoice.add("US: mph"); outputChoice.add("US: knots"); outputChoice.add("SI: km/h"); outputChoice.add("SI: m/s"); } else if (cb == volume) { complex = false; // Assign appropriate factors factorArray = volumeFactor(); inputChoice.add("US: inch"); inputChoice.add("US: feet"); inputChoice.add("US: yard"); inputChoice.add("US: fl. ounces"); inputChoice.add("US: liq. pints"); inputChoice.add("US: liq. quarts"); inputChoice.add("US: gallon"); inputChoice.add("SI: mL"); inputChoice.add("SI: L"); inputChoice.add("SI: m"); outputChoice.add("US: inch"); outputChoice.add("US: feet"); outputChoice.add("US: yard"); outputChoice.add("US: fl. ounces"); outputChoice.add("US: liq. pints"); outputChoice.add("US: liq. quarts"); outputChoice.add("US: gallon"); outputChoice.add("SI: mL"); outputChoice.add("SI: L"); outputChoice.add("SI: m"); } else if (cb == weight) { complex = false; // Assign appropriate factors factorArray = weightFactor(); inputChoice.add("US: drams"); inputChoice.add("US: ounces"); inputChoice.add("US: pounds"); inputChoice.add("US: hundredweight"); inputChoice.add("US: long ton"); inputChoice.add("SI: g"); inputChoice.add("SI: kg"); inputChoice.add("SI: t"); outputChoice.add("US: drams"); outputChoice.add("US: ounces"); outputChoice.add("US: pounds"); outputChoice.add("US: hundredweight"); outputChoice.add("US: long ton"); outputChoice.add("SI: g"); outputChoice.add("SI: kg"); outputChoice.add("SI: t"); } else if (cb == temperature) { // Converting involves addition or subtraction complex = true; inputChoice.add("US: F"); inputChoice.add("SI: C"); outputChoice.add("US: F"); outputChoice.add("SI: C"); } } public void paint(Graphics g) { g.setFont(new Font("", Font.BOLD, 20)); g.setColor(new Color(0, 0, 150)); g.drawString("Units Converter", 110, 30); g.setFont(new Font("", Font.BOLD, 11)); g.drawString("by H.Joon Kim", 270, 200); } ////////////////////////////////////////////////////////////////////////////////// // // The following methods return the appropriate converting factors to the caller. // private static double[] areaFactor() { double cFactor[] = {0.0006452, 0.0929, 0.8361, 2590000, 0.0001, 1.0, 100, 1000000}; return cFactor; } private static double[] energyFactor() { double cFactor[] = {0.112985, 1.35582, 1055.06, 4186.8, 1.0, 3600000, 2647800}; return cFactor; } private static double[] lengthFactor() { double cFactor[] = {0.0254, 0.3048, 0.9144, 1609.344, 0.001, 0.01, 1.0, 1000.0}; return cFactor; } private static double[] pressureFactor() { double cFactor[] = {6894.76, 47.8803, 133.322, 101325, 1.0, 0.1, 100, 100000, 1000000}; return cFactor; } private static double[] velocityFactor() { double cFactor[] = {1.60934, 1.852, 1.0, 3.6}; return cFactor; } private static double[] volumeFactor() { double cFactor[] = {0.01639, 28.3168, 764.555, 0.029574, 0.47318, 0.94625, 3.785, 0.001, 1.0, 1000}; return cFactor; } private static double[] weightFactor() { double cFactor[] = {0.00177184, 0.02834, 0.45359, 45.3592, 907.19404, 0.001, 1.0, 1000.0}; return cFactor; } // //////////////////////////////////////////////////////////////////////////////////// // Convert temperature between Fahrenheit and Celsius. private static double doComplexConversion(double base, int inputIndex, int outputIndex) { if (inputIndex == 0 && outputIndex == 1) { return ((base - 32.0)*(5.0/9.0)); } else if (inputIndex == 1 && outputIndex == 0) { return (base*(9.0/5.0) +32); } else { return base; } } }