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

使用Java AWT与Swing开发登录界面时出现窗口刷屏的异常问题

Java GUI登录界面窗口刷屏问题解决办法

我一眼就看出你代码里的问题了——这是典型的无限实例化导致的窗口刷屏问题,咱们一步步来解决:

问题根源

在你的Login构造方法里,给登录按钮添加监听器时写了login.addActionListener(new Login());。这意味着每创建一个Login对象,内部就会再new一个新的Login实例,而每个新实例又会创建新的JFrame,循环往复自然就出现了窗口疯狂刷屏的情况。

另外还有个小细节问题:你把frame.setVisible(true);放在了组件布局设置之前,这会导致窗口先显示,后续组件加载时可能出现闪烁或者显示不全的情况。

修正后的完整代码

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Login implements ActionListener{
    public Login() {
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();
        JLabel Ulabel = new JLabel("UserName");
        JLabel Plabel = new JLabel("PassWord");
        JTextField Utext = new JTextField(20);
        JPasswordField Ptext = new JPasswordField(20);
        JButton login = new JButton("Login");
        JLabel success = new JLabel("");
        
        panel.setLayout(null);
        panel.add(Ulabel);
        panel.add(Utext);
        panel.add(Plabel);
        panel.add(Ptext);
        panel.add(login);
        panel.add(success);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(350, 150);
        frame.setTitle("Login");
        frame.add(panel);
        
        Ulabel.setBounds(10, 10, 80, 25);
        Utext.setBounds(100, 10, 165, 25);
        Plabel.setBounds(10, 40, 80, 25);
        Ptext.setBounds(100, 40, 165, 25);
        login.setBounds(50, 70, 100, 25);
        success.setBounds(200, 70, 100, 25);
        
        // 关键修改1:使用当前实例作为监听器,不再新建Login对象
        login.addActionListener(this);
        // 关键修改2:把窗口显示放在所有组件配置完成之后
        frame.setVisible(true);
    }
    
    public static void main(String[] args){
        new Login();
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("works");
    }
}

关键修改点说明

  1. 监听器绑定修正:将login.addActionListener(new Login());改为login.addActionListener(this);。你的Login类已经实现了ActionListener接口,当前实例本身就可以作为监听器,不需要再创建新对象,从根源上避免了无限循环实例化的问题。
  2. 窗口显示时机调整:把frame.setVisible(true);移动到构造方法的最后,确保所有组件的布局、添加操作都完成后再显示窗口,这样窗口会一次性渲染完整内容,避免组件加载异常。

现在运行修正后的代码,点击登录按钮就能正常在控制台打印"works",也不会再出现窗口刷屏的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:48:21