2013-05-10 148 views
0

我有一个处理按钮事件的问题。我正在创建一个程序,让用户选择他们想要的披萨类型,程序计算比萨的价格。我有我的布局设置,但是当选择一个中等比萨饼时,按钮没有处理正确的响应。任何人都可以给我一些建议吗?我在过去的一个小时里查看了我的代码,而我似乎无法看到我正在制作的错误。这是我的代码...Java按钮处理程序

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

} 

回答

1

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

JTextField totalField = new JTextField(10); 

变化

this.totalField = new JTextField(10); 
+0

非常感谢!我知道我必须错过简单的事情。我非常感谢帮助 – Mike 2013-05-10 01:29:15

3

你通过在类的构造函数中重新声明totalField变量来映射它。这将导致重新声明的变量,即具有有效对象引用的变量仅在构造函数中可见,仅在声明该变量的范围内,并且将使类字段不构造,从而为空。如果你尝试使用它,你会得到一个NullPointerException或NPE。

解决方案不是在构造函数中重新声明变量,而是在那里初始化类字段(如果需要,可以在类中声明)。

因此,而不是:

public class Foo { 
    private JTextField bar; 

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

做:

public class Foo { 
    private JTextField bar; 

    public Foo() { 
    bar = new JTextField(10); // ** see the difference? ** 
    } 
} 
+0

+1挑好看... – MadProgrammer 2013-05-10 01:06:31

+0

@MadProgrammer:感谢 – 2013-05-10 01:06:40

+0

你能还提到,OP没有实际注册的'ActionListener'对其他任何东西那么'提交按钮:P – MadProgrammer 2013-05-10 01:07:27