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

Java Swing按钮自动激活?窗口双向切换功能异常修复咨询

问题修复方案

核心问题分析

  1. 启动时自动弹出双窗口:构造函数里同时调用了frame1.setVisible(true)和frame2.setVisible(true),导致程序一启动两个窗口直接全部显示。
  2. 事件逻辑嵌套错误:back按钮的判断被包裹在total按钮的if块内部,点击back时永远不会触发对应的窗口切换逻辑。
  3. 窗口关闭规则冲突:两个窗口都设置了EXIT_ON_CLOSE,关闭任意一个窗口会直接终止整个程序,不符合切换需求。

修复后的完整代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class IA2 implements ActionListener{

    JButton total = new JButton();
    JButton back = new JButton();

    JFrame frame1 = new JFrame();
    JFrame frame2 = new JFrame();

    IA2(){
        // 初始化第一个窗口
        frame1.setTitle("Lab equipement");
        frame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame1.setLayout(null);
        frame1.setSize(500, 425);
        frame1.setResizable(false);
        frame1.getContentPane().setBackground(new Color(5, 25, 50));

        // 初始化第二个窗口(默认隐藏)
        frame2.setTitle("Total Equipement");
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame2.setLayout(null);
        frame2.setSize(500, 425);
        frame2.setResizable(false);
        frame2.getContentPane().setBackground(new Color(5, 25, 50));

        // 配置total按钮
        total.setBounds(50, 10, 150, 75);
        frame1.add(total);
        total.addActionListener(this);
        total.setText("Total Equipement");
        total.setFocusable(false);

        // 配置back按钮
        back.setBounds(50, 10, 150, 75);
        frame2.add(back);
        back.addActionListener(this);
        back.setText("Back");
        back.setFocusable(false);

        // 启动时只显示第一个窗口
        frame1.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == total) {
            frame1.dispose();
            frame2.setVisible(true);
        } 
        // 单独处理back按钮的事件逻辑
        else if(e.getSource() == back) {
            frame2.dispose();
            frame1.setVisible(true);
        }
    }

    public static void main(String[] args) {
        // 按Swing规范在事件调度线程启动GUI
        SwingUtilities.invokeLater(IA2::new);
    }
}

关键修改说明

  • 初始化只显主窗口:移除初始化时的frame2.setVisible(true),仅在点击total按钮时才显示第二个窗口。
  • 拆分事件判断逻辑:将back按钮的判断从total的if块中移出,改为独立的else if分支,确保点击back时能触发窗口切换。
  • 调整窗口关闭行为:把EXIT_ON_CLOSE改为DISPOSE_ON_CLOSE,关闭窗口仅释放当前窗口资源,不会直接退出程序。
  • 线程安全启动GUI:通过SwingUtilities.invokeLater启动程序,符合Swing的线程安全要求。

内容的提问来源于stack exchange,提问作者CoderInNeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:40:45