You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:42:03