JRadioButton的ActionListener未生效问题求助
问题场景
编写包含pizzaButton、burgerButton、hotdogButton三个单选按钮的Swing程序,期望选中按钮时打印对应内容。已实现ActionListener并重写actionPerformed方法,且为每个按钮添加了监听器,但点击按钮时始终不触发actionPerformed方法内的逻辑。
错误原因
代码中存在**变量隐藏(Variable Shadowing)**问题:
- 类中已经声明了成员变量
JRadioButton pizzaButton;、burgerButton、hotdogButton - 但在构造函数里重新使用
JRadioButton pizzaButton = new JRadioButton("pizza");创建了同名局部变量,导致类成员变量始终未被初始化(保持null) - 构造函数里给局部变量添加了监听器并加入窗口,但
actionPerformed方法里判断的是类成员变量,当按钮触发事件时,e.getSource()是局部变量的实例,和null的类成员变量不匹配,因此没有任何分支会执行。
修正后的代码
Main类(无需修改)
public class Main { public static void main(String[] args) { new MyFrame(); } }
MyFrame类(修正变量赋值部分)
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MyFrame extends JFrame implements ActionListener { JRadioButton pizzaButton; JRadioButton burgerButton; JRadioButton hotdogButton; MyFrame() { this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.setLayout(new FlowLayout()); // 去掉局部变量声明,直接给类成员变量赋值 pizzaButton = new JRadioButton("pizza"); burgerButton = new JRadioButton("burger"); hotdogButton = new JRadioButton("hot dog"); ButtonGroup group = new ButtonGroup(); group.add(pizzaButton); group.add(burgerButton); group.add(hotdogButton); pizzaButton.addActionListener(this); burgerButton.addActionListener(this); hotdogButton.addActionListener(this); this.add(pizzaButton); this.add(burgerButton); this.add(hotdogButton); this.pack(); this.setVisible(true); // 先完成组件添加与布局再显示窗口,避免布局异常 } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == pizzaButton) { System.out.println("You ordered a pizza"); } else if (e.getSource() == burgerButton) { System.out.println("You ordered a burger"); } else if (e.getSource() == hotdogButton) { System.out.println("You ordered a hot dog"); } } }
内容的提问来源于stack exchange,提问作者Siddharth Vimal
相关产品推荐
相关产品推荐

