I am having an issue handling button events. I am creating a program that lets the user select the type of pizza they want and the program calculates the price of the pizza. I have my layout setup, however when a medium pizza is selected the button is not processing the proper response. Can anyone give me some advice? I have looked over my code for the past hour and I just can't seem to see the error I am making. Here is my code...
public class Prog9Frame extends JFrame implements ActionListener
{
private JLabel title;
private JLabel size;
private JLabel toppings;
private JComboBox crust;
private JRadioButton mediumRadio;
private JRadioButton largeRadio;
private JRadioButton xLargeRadio;
private JCheckBox pepperoniBox;
private JCheckBox sausageBox;
private JCheckBox mushroomsBox;
private JCheckBox onionsBox;
private JLabel total;
private JTextField totalField;
private JButton submit;
public Prog9Frame()
{
super ("Pizzazz Pizza");
setLayout( new BorderLayout( 5,5 ) );
//north region
title = new JLabel ( "Pizzazz Pizza", JLabel.CENTER );
add ( title, BorderLayout.NORTH);
//west region
JPanel westPanel = new JPanel();
westPanel.setLayout( new BoxLayout( westPanel, BoxLayout.Y_AXIS ) );
westPanel.add(Box.createRigidArea( new Dimension( 25,1 )) );
size = new JLabel ( "Size" );
westPanel.add( Box.createVerticalStrut((20)) );
westPanel.add( size );
mediumRadio = new JRadioButton( "Medium" );
westPanel.add(Box.createVerticalStrut(20) );
westPanel.add( mediumRadio );
largeRadio = new JRadioButton( "Large ");
westPanel.add(Box.createVerticalStrut(20));
westPanel.add(largeRadio);
xLargeRadio = new JRadioButton( "X-Large ");
westPanel.add(Box.createVerticalStrut(20));
westPanel.add(xLargeRadio);
add(westPanel, BorderLayout.WEST);
//center region
JPanel centerPanel = new JPanel();
centerPanel.setLayout( new BoxLayout(centerPanel, BoxLayout.Y_AXIS ));
toppings = new JLabel ( "Toppings" );
centerPanel.add(Box.createVerticalStrut(( 20 )) );
centerPanel.add( toppings );
pepperoniBox = new JCheckBox( "Pepperoni" );
centerPanel.add(Box.createVerticalStrut(( 20 )) );
centerPanel.add( pepperoniBox);
sausageBox = new JCheckBox( "Sausage" );
centerPanel.add(Box.createVerticalStrut(( 20 )) );
centerPanel.add( sausageBox);
mushroomsBox = new JCheckBox( "Mushrooms" );
centerPanel.add(Box.createVerticalStrut(( 20 )) );
centerPanel.add( mushroomsBox);
onionsBox = new JCheckBox( "Onions" );
centerPanel.add(Box.createVerticalStrut(( 20 )) );
centerPanel.add( onionsBox);
add( centerPanel, BorderLayout.CENTER);
//east region
JPanel eastPanel = new JPanel();
eastPanel.setLayout(new BoxLayout(eastPanel, BoxLayout.Y_AXIS));
eastPanel.add(Box.createHorizontalStrut(20));
eastPanel.add(Box.createVerticalStrut(50));
String[] crustStrings = { "Thin", "Regular", "Deep Dish" };
JComboBox crust = new JComboBox(crustStrings);
eastPanel.add(crust);
eastPanel.add(Box.createVerticalStrut(200));
add( eastPanel, BorderLayout.EAST);
//south region
JPanel southPanel = new JPanel();
southPanel.setLayout(new FlowLayout( FlowLayout.CENTER) );
JTextField totalField = new JTextField(10);
southPanel.add(totalField);
JButton submit = new JButton ("Submit");
submit.addActionListener( this );
southPanel.add( submit );
add( southPanel, BorderLayout.SOUTH);
}
//handle button events
public void actionPerformed( ActionEvent event )
{
if (mediumRadio.isSelected())
{
double pizzaMed = 7.95;
totalField.setText(new DecimalFormat("###00.00").format(pizzaMed));
}
}
}
You're shadowing the totalField variable by re-declaring it in the class's constructor. This will cause you the re-declared variable, the one that has a valid object reference to be visible only in the constructor, only within the scope within which it was declared, and it will leave the class field unconstructed and thus null. If you try to use it, you'll get a NullPointerException or NPE.
The solution is not to re-declare the variable in the constructor but rather to initialize the class field there (or on declaration in the class if need be).
So rather than:
do:
Update your code for south region. You are re-declaring totalField which hide in actionPerformed method.That's way it gives java.lang.NullPointerException.
change to