// Exercise 12.13
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Temperature extends JFrame
{
private JLabel enterTemp, convertTemp;
private JTextField tempField, resultsField;
private JComboBox scales;
private JRadioButton scaleButtons[];
private ButtonGroup rbGroup;
private JPanel top, middle, bottom;
private Container c;
private String scaleNames[] = {"Fahrenheit", "Centigrade", "Kelvin"};
private RadioButtonHandler handler;
public Temperature()
{
super("Temperature Conversion App");
c = getContentPane();
c.setLayout(new GridLayout(3,1));
setupTop();
setupMiddle();
setupBottom();
setSize(500,300);
show();
}
public void setupTop()
{
top = new JPanel();
top.setLayout(new FlowLayout());
enterTemp = new JLabel("Please enter a temperature:");
top.add(enterTemp);
tempField = new JTextField(5);
top.add(tempField);
scales = new JComboBox(scaleNames);
scales.setMaximumRowCount(1);
top.add(scales);
c.add(top);
}
public void setupMiddle()
{
middle = new JPanel();
middle.setLayout(new FlowLayout());
convertTemp = new JLabel("I wanna convert this to:");
middle.add(convertTemp);
handler = new RadioButtonHandler();
scaleButtons = new JRadioButton[3];
rbGroup = new ButtonGroup();
for (int i=0; i < scaleButtons.length; i++)
{
scaleButtons[i] = new JRadioButton(scaleNames[i], false);
scaleButtons[i].addItemListener(handler);
rbGroup.add(scaleButtons[i]);
middle.add(scaleButtons[i]);
}
c.add(middle);
}
public void setupBottom()
{
bottom = new JPanel();
bottom.setLayout(new FlowLayout());
resultsField = new JTextField(50);
resultsField.setEditable(false);
bottom.add(resultsField);
c.add(bottom);
}
private class RadioButtonHandler implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
if (e.getSource()==scaleButtons[0])
{
if (scales.getSelectedIndex()==0)
resultsField.setText("You already have the Fahrenheit temp!");
else if (scales.getSelectedIndex()==1)
{
convertF2C(enterTemp.getText());
}
else if (scales.getSelectedIndex()==2)
convertF2K(enterTemp.getText());
} // end if
if (e.getSource()==scaleButtons[1])
{
if (scales.getSelectedIndex()==0)
convertC2F(enterTemp.getText());
else if (scales.getSelectedIndex()==1)
resultsField.setText("You already have the Centigrade temp!");
else if (scales.getSelectedIndex()==2)
convertC2K(enterTemp.getText());
} // end if
if (e.getSource()==scaleButtons[2])
{
if (scales.getSelectedIndex()==0)
convertK2F(enterTemp.getText());
else if (scales.getSelectedIndex()==1)
convertK2C(enterTemp.getText());
else if (scales.getSelectedIndex()==2)
resultsField.setText("You already have the Kelvin temp!");
}
} // end itemStateChanged
} // end RadioButtonHandler
public void convertF2C(String input)
{
double temp = Double.parseDouble(input);
String output = "";
output = temp + " degrees Fahrenheit is " + ((5/9)*(temp-32)) + "
degrees Centigrade.";
resultsField.setText(output);
/* resultsField.setText(temp + " degrees Fahrenheit is
"+((5/9)*(temp-32)) + " degrees
Centigrade."); */
}
public void convertF2K(String input)
{ double temp = 0.0;
temp = Double.parseDouble(input);
resultsField.setText(temp + " degrees Fahrenheit is
"+((5/9)*(temp-32)+273) + " degrees
Kelvin.");
}
public void convertC2F(String input)
{
double temp = Double.parseDouble(input);
resultsField.setText(temp + " degrees Centigrade is " +((9/5)*temp+32) +
" degrees
Fahrenheit.");
}
public void convertC2K(String input)
{
double temp = Double.parseDouble(input);
resultsField.setText(temp + " degrees Centigrade is " +(temp+273) + "
degrees Kelvin.");
}
public void convertK2F(String input)
{
double temp = Double.parseDouble(input);
resultsField.setText(temp + " degrees Kelvin is " +((9/5)*(temp-273)+32)
+ " degrees
Fahrenheit.");
}
public void convertK2C(String input)
{
double temp = Double.parseDouble(input);
resultsField.setText(temp + " degrees Kelvin is " + (temp-273) + "
degrees Centigrade.");
}
public static void main(String args[])
{
Temperature app = new Temperature();
app.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
} // end main
} // end class
C:\jdk1.2.1\bin>java Temperature
Exception occurred during event dispatching:
java.lang.NumberFormatException: Please enter a temperature:
at java.lang.FloatingDecimal.readJavaFormatString(Compiled Code)
at java.lang.Double.parseDouble(Double.java:188)
at Temperature.convertC2F(Temperature.java:134)
at
Temperature$RadioButtonHandler.itemStateChanged(Temperature.java:96)
at javax.swing.AbstractButton.fireItemStateChanged(Compiled Code)
at
javax.swing.AbstractButton$ForwardItemEvents.itemStateChanged(Abstrac
tButton.java:1112)
at javax.swing.DefaultButtonModel.fireItemStateChanged(Compiled
Code)
at
javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton
.java:222)
at
javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.
java:239)
at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:217)
at java.awt.Component.processMouseEvent(Component.java:3126)
at java.awt.Component.processEvent(Compiled Code)
at java.awt.Container.processEvent(Compiled Code)
at java.awt.Component.dispatchEventImpl(Compiled Code)
at java.awt.Container.dispatchEventImpl(Compiled Code)
at java.awt.Component.dispatchEvent(Compiled Code)
at java.awt.LightweightDispatcher.retargetMouseEvent(Compiled Code)
at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:1732)
at java.awt.LightweightDispatcher.dispatchEvent(Compiled Code)
at java.awt.Container.dispatchEventImpl(Compiled Code)
at java.awt.Window.dispatchEventImpl(Compiled Code)
at java.awt.Component.dispatchEvent(Compiled Code)
at java.awt.EventQueue.dispatchEvent(Compiled Code)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:68)
> Can you find anything wrong with this code that causes a
> NumberFormatException? I'm a beginner, so I haven't got to exception
> public class Temperature extends JFrame
> {
> private JLabel enterTemp, convertTemp;
> private JTextField tempField, resultsField;
[SNIP]
> if (scales.getSelectedIndex()==0)
> convertC2F(enterTemp.getText());
You are trying to pass the text from enterTemp, which is a _label_, instead
of the text the user is entering, which is in a different control. You need
to make sure you use the right control to get the user input from!
--
--
Jason Teagle
ja...@teagster.co.uk
-----------------------------------------------------------
A list of programming resources I use:
ML: www.windev.org, www.codecipher.com, www.beginthread.com
MB: www.codeguru.com, www.codeproject.com
NG: comp.lang.java.*
OI: www.php.net
-----------------------------------------------------------
"Jason Teagle" <ja...@teagster.co.uk> wrote in message
news:CVhQ8.491$kb3....@news8-gui.server.ntli.net...
> Thank you, Jason! I'm gonna have to be more careful about what I name my
> labels and other widgets. Now I just need to iron out my computation
errors
> :-)
Don't worry, it's an easy slip-up to make. I might recommend you name the
text field "enterTemp" and the label that goes with it "enterTempLegend" - I
find that by slapping "Legend" on the end of the name when I name labels, I
am less likely to mix it up.