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

Java Swing中打开新窗口后如何自动关闭原登录窗口?

解决Java Swing打开新窗口后关闭原窗口的问题

要实现打开新窗口后自动关闭原注册/登录窗口,只需完成以下两步操作:

1. 调整原窗口的默认关闭行为

原代码中setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);会导致关闭原窗口时直接终止整个应用程序。我们需要将其改为JFrame.DISPOSE_ON_CLOSE,这样关闭窗口只会释放该窗口的资源,不会终止整个程序,直到所有窗口都关闭才会退出:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

2. 在打开新窗口后调用关闭方法

在handleRegistration方法里,创建并显示新窗口后,调用this.dispose();即可关闭当前窗口。示例修改如下:

private void handleRegistration(ActionEvent e) {
    // 这里添加创建并显示新窗口的代码,比如主界面窗口
    JFrame mainFrame = new JFrame("主界面");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.add(new JLabel("注册成功!"));
    mainFrame.pack();
    mainFrame.setLocationRelativeTo(null);
    mainFrame.setVisible(true);
    
    // 关闭当前注册窗口
    this.dispose();
}

完整修改后的代码

package com.nono.groupproject;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.ButtonGroup;

public class UserRegistrationGUIConsole extends JFrame {

    private JTextField nameField, addressField, phoneNumberField;
    private JRadioButton maleRadioButton, femaleRadioButton;
    private ButtonGroup sexButtonGroup;

    public UserRegistrationGUIConsole() {
        setTitle("User Registration");
        // 修改默认关闭操作,避免关闭窗口直接终止程序
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(7, 2, 5, 5));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 5, 5, 20));
        
        panel.add(new JLabel("Name:"));
        nameField = new JTextField();
        panel.add(nameField);

        panel.add(new JLabel("Address:"));
        addressField = new JTextField();
        panel.add(addressField);

        panel.add(new JLabel("Phone Number:"));
        phoneNumberField = new JTextField();
        panel.add(phoneNumberField);

        panel.add(new JLabel("Sex:"));
        maleRadioButton = new JRadioButton("Male");
        femaleRadioButton = new JRadioButton("Female");
        sexButtonGroup = new ButtonGroup();
        sexButtonGroup.add(maleRadioButton);
        sexButtonGroup.add(femaleRadioButton);
        panel.add(maleRadioButton);
        panel.add(femaleRadioButton);

        JButton registerButton = new JButton("Register");
        registerButton.addActionListener(e -> handleRegistration(e));

        panel.add(registerButton);

        setContentPane(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void handleRegistration(ActionEvent e) {
        // 创建并显示新的主窗口
        JFrame mainWindow = new JFrame("Main Interface");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.add(new JLabel("Registration Successful!"));
        mainWindow.pack();
        mainWindow.setLocationRelativeTo(null);
        mainWindow.setVisible(true);
        
        // 关闭当前注册窗口
        this.dispose();
    }

    public static void main(String[] args) {
        new UserRegistrationGUIConsole();
    }
}

关键说明

  • dispose():释放当前窗口的所有资源并关闭窗口,不会影响其他已打开的窗口。
  • DISPOSE_ON_CLOSE:当窗口被dispose时,关闭窗口且仅在所有可显示窗口都关闭时终止应用程序,适合多窗口场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:46