CENG325_3_GUI-Temperature converter
CENG325_3_GUI-Temperature converter
This document provides an introduction to Graphical User Interface (GUI) programming with Swing and
the NetBeans IDE.
From an end-user's perspective, usage is simple: enter a temperature (in Celsius) into the text box, click
the "Convert" button, and watch the converted temperature (in Fahrenheit) appear on screen. The
“minimize”, “maximize”, and “close” buttons will behave as expected, and the application will also have
a title that appears along the top of the window.
From a programmer's perspective, we will write the application in two main stages. First, we will
populate the GUI with the various Swing components and arrange them as shown above. Then, we will
add the application logic, so that the program actually performs a conversion when the user presses the
"Convert" button.
Make sure to deselect the "Create Main Class" checkbox; leaving this option selected generates a new
class as the main entry point for the application, but our main GUI window (created in the next step) will
serve that purpose, so checking this box is not necessary. Click the "Finish" button when you are done.
When the IDE finishes loading, you will see a screen similar to the above. All panes will be empty except
for the Projects pane in the upper left hand corner, which shows the newly created project.
Step 4: Add a JFrame Form
Now right-click the CelsiusConverterProject name and choose New -> JFrame Form (JFrame is the Swing
class responsible for the main frame for your application.) You will learn how to designate this class as
the application's entry point later in this lab.
The remainder of the fields should automatically be filled in, as shown above. Click the Finish button
when you are done.
When the IDE finishes loading, the right pane will display a design-time, graphical view of the
CelsiusConverterGUI. It is on this screen that you will visually drag, drop, and manipulate the various
Swing components.
The Palette
The Palette contains all of the components offered by the Swing API; example: JLabel is a text label, JList
is a drop-down list, etc.
From this list, our application will use JLabel (a basic text label), JTextField (for the user to enter the
temperature), and JButton (to convert the temperature from Celsius to Fahrenheit).
A quick look at the source view reveals that the IDE has created a private method named
initComponents, which initializes the various components of the GUI. It also tells the application to "exit
on close", performs some layout-specific tasks, then packs the (soon to be added) components together
on screen. No need to understand this code in any detail.
The Property Editor
The Property Editor does what its name implies: it allows you to edit the properties of each component.
The Property Editor is intuitive to use; in it you will see a series of rows — one row per property — that
you can click and edit without entering the source code directly. The following figure shows the Property
Editor for the newly added JFrame object:
The screenshot above shows the various properties of this object, such as background color, foreground
color, font, and cursor.
The Navigator
The last component of the NetBeans IDE that we will use here is the Navigator. To open it, click on
“Window” in the menu bar then click on Navigator. It will appear in the down left side of the screen,
click on Design to see the following:
The Navigator
The Navigator provides a graphical representation of your application's components. We will use the
Navigator to change a few variable names to something other than their defaults.
This section explains how to use the NetBeans IDE to create the application's GUI. As you drag each
component from the Palette to the Design Area, the IDE auto-generates the appropriate source code.
You can set the title by either double-clicking the title property and entering the new text directly, or by
clicking the button and entering the title in the provided field. Or, as a shortcut, you could single-click
the JFrame of the Navigator and enter its new text directly without using the property editor.
Step 2: Add a JTextField
Next, drag a JTextField from the Palette to the upper left corner of the Design Area. As you approach the
upper left corner, the GUI builder provides visual cues (dashed lines) that suggest the appropriate
spacing. Using these cues as a guide, drop a JTextField into the upper left hand corner of the window as
shown below:
Adding a JTextField
With the GUI components now in place, it is time to make the final adjustments. There are a few
different ways to do this; the order suggested here is just one possible approach.
To see the code in its entirety, scroll up and down within the IDE as necessary. You can expand or
collapse certain blocks of code (such as method bodies) by clicking the + or - symbol on the left-hand
side of the source editor.
The default names are not very relevant in the context of this application, so it makes sense to change
them from their defaults to something that is more meaningful. Right-click each variable name and
choose "Change variable name." When you are finished, the variable names should appear as follows:
The new variable names are "tempTextField", "celsiusLabel", "convertButton", and "fahrenheitLabel".
Each change that you make in the Navigator will automatically propagate its way back into the source
code. You can rest assured that compilation will not fail due to typos or mistakes of that nature.
The final application that we will call “Celsius Converter and Tracker” will look as follows:
First, we will expand the CelsiusConverter project to include also conversion from Celsius to Kelvin.
To do this, add a new Button “Convert” and another “Label” for Kelvin conversion to have the following:
Change the name of the added components to the following variable names: "convertButtonKel" and
"kelvinLabel".
Double click on the new Convert button and copy the following code in the ActionPerformed of the
button:
private void convertButtonKelActionPerformed(java.awt.event.ActionEvent
evt) {
//Parse degrees Celsius as a double and convert to Kelvin
int tempFahr = (int)(Double.parseDouble(tempTextField.getText())
+ 273.15);
kelvinLabel.setText(tempFahr + " Kelvin");
}
In this part, we are going to merge the conversion from Celsius to Fahrenheit and Kelvin in one button
using the ComboBox, to have the following form:
First, organize you JFrame to have the components in the figure above. The first JtextField where you
enter the temperature in Celsius will be named “jTextField1” and the second JtextField where you enter
the temperature in Celsius will be named “jTextField2”. The ComboBox name is “jComboBox1”.
To fill in the ComboBox, write the following code in the default constructor of the main class of your
project:
jComboBox1.addItem("Fahrenheit");
jComboBox1.addItem("Kelvin");
if (jComboBox1.getSelectedItem()=="Fahrenheit")
{
Int tempFahr = (int)((Double.parseDouble(jTextField1.getText()))
*1.8 + 32);
jTextField2.setText(tempFahr + " Fahrenheit");
}
if (jComboBox1.getSelectedItem()=="Kelvin")
{
int tempKelv = (int)(Double.parseDouble(jTextField1.getText())
+273.15);
jTextField2.setText(tempKelv + " Kelvin");
}
Now, you can run your application and test that it does convert from Celsius to Fahrenheit or Kelvin
depending on the selected choice in the ComboBox.
Part 3: Saving temperature values to a file
Here, we will save each entered temperature in a text file that we will name "Temp.txt".
To do this we will add a new button “Save” and enter the following code in its ActionPerformed:
FileWriter out;
try {
out = new FileWriter("Temp.txt", true);
out.write(jTextField1.getText()+"\n");
out.close();
} catch(IOException e) {
System.out.println("Error appending to file " + "Temp.txt");
}
The idea here is to show the saved results in a table when the button “Show Results” is clicked.
This should create a new JFrame with a Table inside. Then, the temperature values are read from the file
"Temp.txt" and shown in the table as follows:
To do so, add a new button “Show Results” and enter the following code in its ActionPerformed:
rows = myArr.size();
table.getColumnModel().getColumn(0).setHeaderValue("Temperature");