Java中如何在自定义Button类中调用主类创建的Frame实例修改可见性
报错原因
报错核心为变量作用域不匹配,firstFrame、secondFrame是Main类main方法的局部变量,仅在main方法内部生效,MyButton类的作用域完全无法访问这两个实例,因此触发符号无法识别的报错。另外原代码还存在逻辑遗漏:MyButton构造方法没有绑定ActionListener,点击按钮不会触发actionPerformed逻辑。
修复方案
- 首先修改MyButton类,新增两个成员变量存储需要控制的窗口实例,调整构造方法接收参数,同时补充ActionListener绑定逻辑
package com.company; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MyButton extends JButton implements ActionListener{ // 新增成员变量存储两个目标窗口 private MyFrame firstFrame; private MySecondFrame secondFrame; // 构造方法新增参数接收两个窗口实例 MyButton(MyFrame firstFrame, MySecondFrame secondFrame){ this.firstFrame = firstFrame; this.secondFrame = secondFrame; this.setBounds(150, 100, 200, 50); this.setText("Convert Currencies"); this.setFocusable(false); this.setVisible(true); // 绑定点击事件监听器 this.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==this){ firstFrame.setVisible(false); secondFrame.setVisible(true); } } }
- 其次修改Main类的实例化逻辑,创建MyButton时传入两个窗口实例,同时默认隐藏第二个窗口避免启动时同时显示两个窗口
package com.company; public class Main { public static void main(String[] args) { MyFrame firstFrame = new MyFrame(); MySecondFrame secondFrame = new MySecondFrame(); // 实例化按钮时传入两个窗口实例 MyButton firstButton = new MyButton(firstFrame, secondFrame); MyLabel firstLabel = new MyLabel(); firstFrame.add(firstButton); // 隐藏第二个窗口,点击按钮后再显示 secondFrame.setVisible(false); } }
可选优化点
你可以直接把MySecondFrame构造方法中的this.setVisible(true)改为this.setVisible(false),就不需要在main方法中额外设置隐藏。
内容的提问来源于stack exchange,提问作者jakob
相关产品推荐
相关产品推荐

