Java如何跨类访问JButton修改文本,解决静态引用非静态字段报错
报错原因说明
- 第一个报错
goPauseButton cannot be resolved:PlayingField类中没有声明goPauseButton这个变量,直接调用自然找不到该成员。 - 第二个报错
Cannot make a static reference to the non-static field PrisonersDilemma.goPauseButton:goPauseButton是PrisonersDilemma类的实例成员,只有创建了PrisonersDilemma的实例对象之后该变量才会被初始化,你直接用类名访问相当于把它当成静态成员调用,自然不符合Java语法规则。
解决方案
方案1:直接从事件对象获取触发事件的按钮(最简便)
你点击的对象本身就是goPauseButton,直接从事件参数里拿事件源即可,不需要额外关联主类:
把PlayingField类actionPerformed方法里的报错行替换成以下代码:
JButton clickBtn = (JButton) e.getSource(); clickBtn.setText("Pause");
方案2:通过构造函数传递主类实例
如果后续你还需要在PlayingField里访问主类的其他成员,可以用这个方法:
- 修改
PlayingField类,新增构造参数接收主类实例:
public class PlayingField extends JPanel implements ActionListener, ChangeListener { private boolean started; // 新增成员变量存储主类实例 private PrisonersDilemma mainInstance; // 新增构造方法 public PlayingField(PrisonersDilemma mainInstance) { this.mainInstance = mainInstance; } @Override public void actionPerformed(ActionEvent e) { if ("GO!".equals(e.getActionCommand())){ System.out.println("GO!"); started = true; // 用主类实例访问按钮 mainInstance.goPauseButton.setText("Pause"); } // 其余逻辑不变 } }
- 修改
PrisonersDilemma类中创建PlayingField实例的代码,把当前主类实例传进去:
field = new PlayingField(this);
注意事项
不建议你把goPauseButton改成静态成员来适配类名调用的写法,Swing组件设置为静态非常容易引发内存泄漏,也不符合面向对象的设计规范。
内容的提问来源于stack exchange,提问作者Smiley17
相关产品推荐
相关产品推荐

