Java Swing多窗口切换时静态上下文无法引用Main.this及符号报错如何解决
错误原因及修复方案
1. 'com.company.Main.this' cannot be referenced from a static context 报错解决
main是静态方法,属于类本身,不属于类的实例对象,而this关键字指向的是类的实例,所以静态方法里不能直接使用this。同时你在main方法里定义的firstFrame、secondFrame都是局部变量,只有main方法内部能访问,onClick方法无法获取这两个窗口对象,这也是第二个报错的核心诱因之一。
2. onClick方法无法解析符号报错解决
有两个问题需要修正:
- Java接口中的方法默认是
public权限,实现类重写方法时权限不能低于父级,你实现onClick时没有加public修饰符,权限不匹配 onClick方法中用到的firstFrame、secondFrame是main方法的局部变量,作用域不包含onClick方法,需要把两个窗口提升为类的成员变量
3. 隐藏功能bug修复
你目前的MyButton实现了ActionListener,但没有把监听器绑定到按钮本身,点击按钮不会触发事件回调,需要在MyButton构造方法中新增绑定逻辑。
修正后的完整代码
修正后的Main类
package com.company; interface ButtonListener{ void onClick(); } public class Main implements ButtonListener { // 将窗口提升为成员变量,供onClick方法访问 private MyFrame firstFrame; private MySecondFrame secondFrame; // 把窗口初始化逻辑放到构造方法中,规避静态方法无法使用this的问题 public Main() { firstFrame = new MyFrame(); MyButton firstButton = new MyButton(this); secondFrame = new MySecondFrame(); // 初始状态第二个窗口隐藏,点击按钮后再显示 secondFrame.setVisible(false); firstFrame.add(firstButton); } public static void main(String[] args) { // 直接实例化Main对象即可,无需在静态方法中处理实例逻辑 new Main(); } // 重写接口方法必须加public修饰符 @Override public void onClick() { firstFrame.setVisible(false); secondFrame.setVisible(true); } }
修正后的MyButton类
package com.company; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MyButton extends JButton implements ActionListener{ private ButtonListener buttonListener; MyButton(ButtonListener buttonListener){ this.buttonListener = buttonListener; 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){ buttonListener.onClick(); } } }
内容的提问来源于stack exchange,提问作者jakob
相关产品推荐
相关产品推荐

