如何为MouseListener传参?汉诺塔JLabel点击显示结果异常问题
解决汉诺塔计算结果始终为0的问题
我来帮你分析问题根源,以及具体的修复方案:
问题核心原因
你遇到的问题本质是**HanoisFrames类中的input变量没有被正确赋值**:
- 你在
HanoisFrames里定义了static int input,静态变量属于类本身,默认初始值是0,而且构造函数public HanoisFrames(int input)并没有把传入的参数值赋值给这个静态变量。 - 当
MouseHandler里调用hanoiCalculator(input)时,实际使用的是这个默认值为0的静态变量,所以结果永远是0。 - 你尝试让
MouseHandler继承HanoisFrames的做法是错误的:内部类本来就可以直接访问外部类的成员,继承反而会创建一个新的HanoisFrames实例,和当前窗口的实例毫无关联,自然解决不了问题。
具体修复步骤
1. 将静态input改为实例成员变量
打开HanoisFrames类,去掉input的static修饰符,改成实例级别的成员变量(建议加上private修饰符,符合封装原则):
// 替换原来的 static int input; private int input;
2. 在构造函数中给成员变量赋值
在HanoisFrames的构造函数里,把传入的参数赋值给刚才定义的成员变量:
public HanoisFrames(int input) { this.input = input; // 新增这一行,将构造参数赋值给实例变量 // 以下是你原来的构造代码,保持不变 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 901, 696); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); // ... 其余构造代码 }
3. 保持MouseHandler为普通内部类
不需要让MouseHandler继承HanoisFrames,内部类可以直接访问外部类的实例成员变量。你可以选择两种方式修复调用逻辑:
方案A:保留hanoiCalculator带参数的形式
在MouseHandler的mousePressed方法中,传入外部类的实例变量input:
public void mousePressed(MouseEvent e) { answer.setText("Answer: " + String.valueOf(hanoiCalculator(HanoisFrames.this.input))); }
方案B:优化hanoiCalculator为无参数方法
既然input已经是实例变量,让hanoiCalculator直接使用这个变量,去掉方法参数:
public int hanoiCalculator() { if (this.input == 0){ return 0; }else if (this.input == 1){ return 1; }else{ return 2*(hanoiCalculator(this.input - 1)+1)-1; } }
然后在mousePressed里直接调用:
public void mousePressed(MouseEvent e) { answer.setText("Answer: " + String.valueOf(hanoiCalculator())); }
验证修复效果
完成以上修改后,当你点击按钮打开HanoisFrames窗口时,传入的关卡值会被正确保存到实例变量中,点击answer标签时,就会使用正确的input值计算汉诺塔的移动次数了。
内容的提问来源于stack exchange,提问作者user10924919
相关产品推荐
相关产品推荐

