0

我在处理按钮事件时遇到问题。我正在创建一个程序,让用户选择他们想要的比萨饼类型,程序计算比萨饼的价格。I have my layout setup, however when a medium pizza is selected the button is not processing the proper response. 谁能给我一些建议?在过去的一个小时里,我查看了我的代码,但我似乎看不到我正在犯的错误。这是我的代码...

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));
        }
    }

}
4

2 回答 2

3

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:

public class Foo {
   private JTextField bar;

   public Foo() {
     JTextField bar = new JTextField(10);  // re-declaring bar here
   }
}

do:

public class Foo {
   private JTextField bar;

   public Foo() {
     bar = new JTextField(10);  // ** see the difference? **
   }
}
于 2013-05-10T01:06:07.533 回答
1

更新南部地区的代码。您正在重新声明隐藏在 actionPerformed 方法中的 totalField。这就是它给出 java.lang.NullPointerException 的方式。

JTextField totalField = new JTextField(10);

改成

this.totalField = new JTextField(10);
于 2013-05-10T01:20:34.843 回答