使用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"); } }
关键修改点说明
- 监听器绑定修正:将
login.addActionListener(new Login());改为login.addActionListener(this);。你的Login类已经实现了ActionListener接口,当前实例本身就可以作为监听器,不需要再创建新对象,从根源上避免了无限循环实例化的问题。 - 窗口显示时机调整:把
frame.setVisible(true);移动到构造方法的最后,确保所有组件的布局、添加操作都完成后再显示窗口,这样窗口会一次性渲染完整内容,避免组件加载异常。
现在运行修正后的代码,点击登录按钮就能正常在控制台打印"works",也不会再出现窗口刷屏的问题了。
内容的提问来源于stack exchange,提问作者PROMAN8625
相关产品推荐
相关产品推荐

