Java Notes
Example - Kilometers to Miles - Complete
Here is the entire working program. The code that adds and defines a button listener is at Note 1 and Note 2.
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 71 |
// intro-window/KmToMiles.java - Converts Kilometers to Miles.
// Fred Swartz, 2004-10-28
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
//////////////////////////////////////////////////////// class KmToMiles
class KmToMiles {
//====================================================== method main
public static void main(String[] args) {
JFrame window = new KmToMilesGUI();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
///////////////////////////////////////////////////// class KmToMilesGUI
class KmToMilesGUI extends JFrame {
//======================================= instance variables
private JTextField m_milesTf = new JTextField(10);
private JTextField m_kilometersTf = new JTextField(10);
private JButton m_convertBtn = new JButton("Convert");
//====================================================== constructor
public KmToMilesGUI() {
//... Create content panel, set layout, add components
JPanel content = new JPanel();
content.setLayout(new FlowLayout()); // use FlowLayout
content.add(new JLabel("Kilometers")); // create, add label
content.add(m_kilometersTf); // add input field
content.add(m_convertBtn); // add button
content.add(new JLabel("Miles")); // create, add label
content.add(m_milesTf); // add output field
this.setContentPane(content);
this.pack();
//... Add listener //Note 1
m_convertBtn.addActionListener(new ConvertBtnListener());
//... Set window characteristics
this.setTitle("Kilometers to Miles");
}//end constructor
//================================================ ConvertBtnListener
class ConvertBtnListener implements ActionListener { //Note 2
public void actionPerformed(ActionEvent e) {
//... Get the value from the km textfield.
String kmStr = m_kilometersTf.getText(); //Note 3
double km = Double.parseDouble(kmStr);
//... Convert it
double mi = convertKmToMi(km); //Note 4
//... Convert it to a string and set mi textfield
m_milesTf.setText("" + mi); //Note 5
}
}
//===================================================== convertKmToMi
public static double convertKmToMi(double kilometers) {
// Assume there are 0.621 miles in a kilometer.
double miles = kilometers * 0.621;
return miles;
}
}//end class KmToMilesGUI
|
Notes
Note 1: The addActionListener() method is called to add a "listener" to a button. When the button is pressed, the actionPerformed() method of the listener object is called. See below.
Note 2: There are many ways to define a listener. This is one of most common - define an inner class that "implements ActionListener", and in that class define the actionPerformed() method.
Note 3: Get the text from a JTextField with a call to its getText() method. This always returns a string. In this case the string must be converted to a number before it can be used in the computation.
Note 4: We could have jsut put this simple computation right here instead of calling another function, but it's a good idea to get used to separating the user interface code from the "model" or "logic" code.
Note 5: Set the value of a JTextField by calling its setText() method and passing a string to it.
Other Possibilities
Some other common variations to structuring a program.
- The main program can be in any class, so it's common in small programs to throw it into an existing class. It's clearer in a separate class.
- Each top-level class is usually in its own file, not combined with other classes in one file.
- The logic or model (in this case the conversion from kilometers to miles) should be in a separate class that knows nothing about the user interface, only about the computation.