XazGreatXia 2024-07-13 13:50 采纳率: 31%
浏览 5
已结题

Java按钮点击后卡死问题

client.java


package ChatExtends;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class LoginWindow extends JFrame {

    User u = new User();

    public void Load() throws Exception{

        this.setName("Login");

        this.setLayout(null);

        this.setSize(600,600);

        this.setResizable(false);

        this.setLocationRelativeTo(null);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container ct = this.getContentPane();

        JPanel jp1 = new JPanel();

        JPanel jp2 = new JPanel();

        JPanel jp3 = new JPanel();

        JPanel jp4 = new JPanel();

        jp1.setSize(600, 150);

        jp2.setBounds(0,150,500,300);

        GridLayout gy = new GridLayout(4,1,5,5);

        this.setLayout(gy);

        jp4.setLayout(new GridLayout(1,2,5,5));

        jp4.setSize(600,150);

        Font f = new Font("Blackletter",Font.ITALIC,100);

        JLabel name = new JLabel("ChatW");

        name.setFont(f);

        name.setBounds(100,300,600,300);

        name.setForeground(Color.blue);

        name.setVisible(true);

        jp1.add(name);

        JLabel l = new JLabel();

        ImageIcon ic1 = new ImageIcon("images/login.png");

        l.setIcon(ic1);

        //l.setBounds(0, 100, ic1.getIconWidth(), ic1.getIconHeight());

        l.setVisible(true);

        l.setHorizontalAlignment(SwingConstants.CENTER);

        l.setVerticalAlignment(SwingConstants.CENTER);

        JTextField text1 = new JTextField(15);

        u.name = text1.getText();

        text1.setBorder(null);

        text1.setVisible(true);

        JLabel l1 = new JLabel();

        ImageIcon ic2 = new ImageIcon("images/lock.png");

        l1.setIcon(ic2);

        //l1.setBounds(0,300,ic2.getIconWidth(),ic2.getIconHeight());

        l1.setVisible(true);

        l1.setHorizontalAlignment(SwingConstants.CENTER);

        l1.setVerticalAlignment(SwingConstants.CENTER);

        JPasswordField jf = new JPasswordField(15);

        u.pass = Encryted.FinalEncrypted(new String(jf.getPassword()));

        jf.setBorder(null);

        //jf.setBounds(50,300,200,100);

        Font b = new Font("Arial",Font.ITALIC,50);

        JButton jb1 = new JButton("Login");

        jb1.setFont(b);

        jb1.setBorder(null);

        jb1.setFocusPainted(false);

        jb1.setVisible(true);

        jb1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                UserOperation t = new UserOperation();

                try {
                    
                    if(t.CheckUser(u.name, u.pass)) {

                        ImageIcon i1 = new ImageIcon("../images/correct.png");

                        JOptionPane.showMessageDialog(null, "Login Success!","",JOptionPane.INFORMATION_MESSAGE,i1);

                    } else {

                        ImageIcon i2 = new ImageIcon("../images/error.png");

                        JOptionPane.showMessageDialog(null,"Login Failed!The login or password is incorrect!","",JOptionPane.INFORMATION_MESSAGE,i2);

                    }

                } catch (Exception r) {

                    r.printStackTrace();

                }

            }

        });

        JButton jb2 = new JButton("Register");

        jb2.setFont(b);

        jb2.setBorder(null);

        jb2.setFocusPainted(false);

        jb2.setVisible(true);

        jp4.add(jb1);

        jp4.add(jb2);

        jp2.add(l);

        jp2.add(text1);

        jp3.add(l1);

        jp3.add(jf);

        jp2.setVisible(true);

        this.add(jp1);

        this.add(jp2);

        this.add(jp3);

        this.add(jp4);

        this.setVisible(true);

        ct.add(jp1,"North");

        ct.add(jp2,"Center");

        ct.add(jp3,"Center");

        ct.add(jp4,"South");

    }

    
}

class User {

    String id;

    String name;

    String pass;

}

UserOperation.java


package ChatExtends;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.Random;

public class UserOperation {

    InputStream inputs = this.getClass().getResourceAsStream("../conf/server.properties");

    Properties p = new Properties();

    
    public boolean CheckUser(String name,String pass) throws Exception{

        boolean flag = false;

        Class.forName("com.mysql.cj.jdbc.Driver");

        p.load(inputs);

        String DBHost = p.getProperty("sqlhost");

        String DBName = p.getProperty("sqldata");

        String DBUser = p.getProperty("sqluser");

        String DBPass = p.getProperty("sqlpass");

        String sqlurl = "jdbc:mysql://" + DBHost + "/" + DBName;

        Connection connect = DriverManager.getConnection(sqlurl,DBUser,DBPass);
        
        String SQLSelectName = "select ? from UserInformation";

        String SQLSelectPass = "select Pass from UserInformation where Name = ?";

        String SQLCheckAvailable = "select Available from UserInformation where name = ?";

        PreparedStatement pre1 = connect.prepareStatement(SQLSelectName);

        pre1.setString(1,name);

        PreparedStatement pre2 = connect.prepareStatement(SQLSelectPass);

        pre2.setString(1,name);

        PreparedStatement pre3 = connect.prepareStatement(SQLCheckAvailable);

        pre3.setString(1,name);

        ResultSet rs1 = pre1.executeQuery();

        ResultSet rs2 = pre2.executeQuery();

        ResultSet rs3 = pre3.executeQuery();

        if(rs1.next() && rs2.next()) {

            if(rs2.getString("Pass") == Encryted.FinalEncrypted(pass) && rs3.getString("Available") == "YES") {

                flag = true;

            } else {

                flag = false;

            }

        } else {

            flag = false;

        }

        return flag;

    }

    public boolean addUser(String name,String password) throws Exception{

        boolean r = false;

        String Id = RandomString();

        String epass = Encryted.FinalEncrypted(password);

        p.load(inputs);

        String DBHost = p.getProperty("sqlhost");

        String DBName = p.getProperty("sqldata");

        String DBUser = p.getProperty("sqluser");

        String DBPass = p.getProperty("sqlpass");

        String sqlurl = "jdbc:mysql://" + DBHost + "/" + DBName;

        Connection con2 = DriverManager.getConnection(sqlurl,DBUser,DBPass);

        String regist = "insert into UserInformation values(?,?,?,?)";
        
        PreparedStatement pre = con2.prepareCall(regist);

        pre.setString(1,Id);

        pre.setString(2,name);

        pre.setString(3,epass);

        pre.setString(4,"Yes");

        if(pre.executeUpdate() > 0) {

            r = true;

        } else {

            r = false;


        }

        return r;
    }

    public String RandomString() {

        String LetterInUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        String LetterInLowerCase = "abcdefghijklmnopqrstuvwxyz";

        String Numbers = "0123456789";

        String All = LetterInUpperCase + LetterInLowerCase + Numbers;

        StringBuffer RandString = new StringBuffer();

        for(int g = 0;g < 10;g++) {

            Random rand = new Random();

            int RandIndex = rand.nextInt(g);

            RandString.append(All.charAt(RandIndex));

        }

        return RandString.toString();
        

    }
     

}

上面的代码可以怎么优化,让按钮点击不卡死呢

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-13 13:52
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户遇到的问题是点击按钮后程序卡死。这种情况通常是由于在事件处理线程(Event Dispatch Thread, EDT)中执行了耗时操作,导致界面无法响应。在Java Swing中,所有与界面相关的操作都应该在EDT中进行,而耗时操作应该放在单独的线程中执行,以避免阻塞EDT。

    解决方案

    为了解决按钮点击后卡死的问题,我们需要将耗时的用户验证操作放在一个单独的线程中执行。可以使用Java的SwingWorker类来实现这一点。SwingWorker类允许在后台线程中执行耗时操作,并在操作完成后更新UI。

    修改步骤

    1. 引入SwingWorker:在LoginWindow类中引入SwingWorker
    2. 重构actionPerformed方法:将用户验证操作放在SwingWorker中执行。

    修改后的代码

    package ChatExtends;
    
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class LoginWindow extends JFrame {
    
        User u = new User();
    
        public void Load() throws Exception {
            this.setName("Login");
            this.setLayout(null);
            this.setSize(600, 600);
            this.setResizable(false);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            Container ct = this.getContentPane();
    
            JPanel jp1 = new JPanel();
            JPanel jp2 = new JPanel();
            JPanel jp3 = new JPanel();
            JPanel jp4 = new JPanel();
    
            jp1.setSize(600, 150);
            jp2.setBounds(0, 150, 500, 300);
    
            GridLayout gy = new GridLayout(4, 1, 5, 5);
            this.setLayout(gy);
    
            jp4.setLayout(new GridLayout(1, 2, 5, 5));
            jp4.setSize(600, 150);
    
            Font f = new Font("Blackletter", Font.ITALIC, 100);
            JLabel name = new JLabel("ChatW");
            name.setFont(f);
            name.setBounds(100, 300, 600, 300);
            name.setForeground(Color.blue);
            name.setVisible(true);
            jp1.add(name);
    
            JLabel l = new JLabel();
            ImageIcon ic1 = new ImageIcon("images/login.png");
            l.setIcon(ic1);
            l.setVisible(true);
            l.setHorizontalAlignment(SwingConstants.CENTER);
            l.setVerticalAlignment(SwingConstants.CENTER);
    
            JTextField text1 = new JTextField(15);
            u.name = text1.getText();
            text1.setBorder(null);
            text1.setVisible(true);
    
            JLabel l1 = new JLabel();
            ImageIcon ic2 = new ImageIcon("images/lock.png");
            l1.setIcon(ic2);
            l1.setVisible(true);
            l1.setHorizontalAlignment(SwingConstants.CENTER);
            l1.setVerticalAlignment(SwingConstants.CENTER);
    
            JPasswordField jf = new JPasswordField(15);
            u.pass = Encryted.FinalEncrypted(new String(jf.getPassword()));
            jf.setBorder(null);
    
            Font b = new Font("Arial", Font.ITALIC, 50);
            JButton jb1 = new JButton("Login");
            jb1.setFont(b);
            jb1.setBorder(null);
            jb1.setFocusPainted(false);
            jb1.setVisible(true);
            jb1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    new LoginWorker(u.name, u.pass).execute();
                }
            });
    
            JButton jb2 = new JButton("Register");
            jb2.setFont(b);
            jb2.setBorder(null);
            jb2.setFocusPainted(false);
            jb2.setVisible(true);
    
            jp4.add(jb1);
            jp4.add(jb2);
            jp2.add(l);
            jp2.add(text1);
            jp3.add(l1);
            jp3.add(jf);
            jp2.setVisible(true);
    
            this.add(jp1);
            this.add(jp2);
            this.add(jp3);
            this.add(jp4);
            this.setVisible(true);
    
            ct.add(jp1, "North");
            ct.add(jp2, "Center");
            ct.add(jp3, "Center");
            ct.add(jp4, "South");
        }
    
        private class LoginWorker extends SwingWorker<Boolean, Void> {
            private String name;
            private String pass;
    
            public LoginWorker(String name, String pass) {
                this.name = name;
                this.pass = pass;
            }
    
            @Override
            protected Boolean doInBackground() throws Exception {
                UserOperation t = new UserOperation();
                return t.CheckUser(name, pass);
            }
    
            @Override
            protected void done() {
                try {
                    boolean result = get();
                    if (result) {
                        ImageIcon i1 = new ImageIcon("../images/correct.png");
                        JOptionPane.showMessageDialog(null, "Login Success!", "", JOptionPane.INFORMATION_MESSAGE, i1);
                    } else {
                        ImageIcon i2 = new ImageIcon("../images/error.png");
                        JOptionPane.showMessageDialog(null, "Login Failed! The login or password is incorrect!", "", JOptionPane.INFORMATION_MESSAGE, i2);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    class User {
        String id;
        String name;
        String pass;
    }
    

    解释

    1. 引入SwingWorker:在LoginWindow类中引入SwingWorker类。
    2. 创建LoginWorker:这是一个内部类,继承自SwingWorker,用于在后台线程中执行用户验证操作。
    3. 重构actionPerformed方法:在按钮的ActionListener中,创建一个LoginWorker实例并调用execute()方法,这将启动后台线程执行用户验证操作。
    4. 实现doInBackground方法:在LoginWorker类中,重写doInBackground方法,执行耗时的用户验证操作。
    5. 实现done方法:在LoginWorker类中,重写done方法,在用户验证操作完成后更新UI。

    通过这些修改,按钮点击后将不会卡死,因为耗时的用户验证操作在后台线程中执行,不会阻塞EDT。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月23日
  • 已采纳回答 7月15日
  • 创建了问题 7月13日

悬赏问题

  • ¥15 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题
  • ¥15 python的EOFError该怎么解决?
  • ¥15 Fluent,液体进入旋转区域体积分数不连续
  • ¥15 java linux下将docx文件转pdf
  • ¥15 maven无法下载依赖包
  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 layui数据重载无效
  • ¥15 寻找了解qq家园纵横四海的程序猿。