# Java Notes

# Example - Generic Calc

This program converts miles into kilometers. It provides a basic plan for making a program that, when a button is pressed, takes input from a field, computes a new value based on that, and puts the result in another field. Extending this program is the basis for many other examples. To customize it:

- Change the documentation.
- Change the names of the components (window, fields, button, etc). Remember to save the file in a name that matches the new class name.
- Add additional labels, fields, or buttons that are needed.
- The button listener may have to be changed to convert the input to the correct type to match the parameter(s) of the method that does the calculations.

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
    // File   : GUI/components/calculator/GenericCalc.java
    // Purpose: Demo input field, button, output field.
    // Author : Fred Swartz, 2006-12-25, Placed in public domain.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    ////////////////////////////////////////////////////// class GenericCalc
    class GenericCalc extends JFrame {
        //======================================================== constants
        private static final double KILOMETERS_PER_MILE = 1.609344;

        //=============================================== instance variables
        private JTextField m_milesTf      = new JTextField(10);
        private JTextField m_kilometersTf = new JTextField(10);
        private JButton    m_convertBtn   = new JButton("Convert");

        //====================================================== method main
        public static void main(String[] args) {
            JFrame window = new GenericCalc();
        }

        //====================================================== constructor
        public GenericCalc() {
            //... Add a listener to the button
            m_convertBtn.addActionListener(new ConvertListener());

            //... Create content panel, set layout, add components
            JPanel content = new JPanel();
            content.setLayout(new FlowLayout());   // Use FlowLayout
            content.add(new JLabel("Miles"));      // Create and add label
            content.add(m_milesTf);                // Add input field
            content.add(m_convertBtn);             // Add button
            content.add(new JLabel("Kilometers")); // Create and add label
            content.add(m_kilometersTf);           // Add output field

            //... Set window characteristics
            setContentPane(content);
            pack();
            setLocationRelativeTo(null);
            setTitle("Miles to Kilometers");
            setResizable(false);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
        }

        ///////////////////////////////////////// inner class ConvertListener
        class ConvertListener implements ActionListener {
            //=============================================== actionPerformed
            public void actionPerformed(ActionEvent e) {
                String miles = m_milesTf.getText();        // Get input
                double mi = Double.parseDouble(miles);     // Str to double
                double km = convertMilesToKilometers(mi);  // Miles to kms
                m_kilometersTf.setText("" + km);           // Set output
            }
        }

        //========================================= convertMilesToKilometers
        // Performing the pure logic of the program (often called the model)
        //    is typically done in a separate class.
        //    Here we only put it into a separate method.
        // You might think this is too trivial to put into a method.
        //    Perhaps in this case, but it is a very good habit to
        //    acquire because in "real" programs there will be
        //    a big payoff in clarity.
        public double convertMilesToKilometers(double miles) {
            return miles * KILOMETERS_PER_MILE;
        }
    }