为什么JavaFX在运行进程时卡住?

问题描述 投票:-1回答:1

我正在使用JavaFX构建应用程序。应用程序对MySQL数据库执行一些CRUD操作。所以目前,我有2个功能。

  1. 用户注册。
  2. 电子邮件验证(检查数据库中是否已经存在电子邮件。)>
  3. 用户注册在JFoenix Button事件中被调用。单击后,它将在另一个类中分别调用以下三个函数,

public static int insertUser(User user) {
    int status = 0;

    try {
        Connection con = DbConnection.getConnection();  
        PreparedStatement ps = con.prepareStatement("INSERT INTO users (name, password, email, country) VALUES (?, ?, ?, ?)");  
        ps.setString(1, user.getName());  
        ps.setString(2, user.getPassword());  
        ps.setString(3, user.getEmail());  
        ps.setString(4, user.getCountry());

        status = ps.executeUpdate();  

        con.close();  
    }catch(Exception ex) {
        ex.printStackTrace();
    }
    return status;  
}

public static int updateTime(String email, String timestamp) {
    int status = 0;

    try {
        Connection con = DbConnection.getConnection();  
        PreparedStatement ps = con.prepareStatement("UPDATE users SET timestamp = ? WHERE email = ?");
        ps.setString(1, timestamp);
        ps.setString(2, email);

        status = ps.executeUpdate();  

        con.close();  
    }catch(Exception ex) {
        ex.printStackTrace();
    }
    return status;  
}

问题是,当我单击按钮时,我看到它在运行该进程时卡住了。所以我将代码放在下面,

Platform.runLater(() -> {
    try {

    } catch (Exception ex) {
        Exceptions.printStackTrace(ex);
    }
});

现在还可以,但是单击后我发现它有点卡住(波纹效果不能很好地工作,鼠标悬停效果也不能照常工作。)

并且当用户在文本字段中键入电子邮件并且触发密钥释放事件并正在检查数据库结果时,电子邮件验证才完成。用于检查电子邮件的代码如下,

public static boolean emailAvailability(String email) {
    boolean status = false;

    try {
        Connection con = DbConnection.getConnection();  
        PreparedStatement ps = con.prepareStatement("SELECT email FROM users WHERE email = ?");
        ps.setString(1, email);

        ResultSet rs = ps.executeQuery();

        status = rs.next();

        con.close();  
    }catch(Exception ex) {
        ex.printStackTrace();
    }
    return status;  
}

在关键事件中,它还会被卡住。几毫秒内无法输入字符。

我没有看到我的代码有任何问题,因为我已经使用Java Swing进行了很多次,并且在Swing中都可以正常工作。而且,如果某个按钮卡在了正在运行的进程中,那么我只需将这些代码放在下面,即可正常运行,

new Thread(new Runnable() {
   public void run() {

   }
}).start();

我不打算或不尝试比较Java Swing和JavaFX,但是我需要知道JavaFX为什么会这样表现?如果这不是一个很大的过程,我应该怎么做才能避免此问题并以CSS效果顺利运行该程序?如果有人可以帮助我,我真的很感激。预先感谢。

UPDATE

这是我的signUp代码。单击按钮时执行,

private void signUp(ActionEvent event) {
    if (name.getText.equals("") && name.getText().isEmpty()) {
        if (!name.getStyleClass().contains("error-class")) {
            name.getStyleClass().add("error-class");
            nameImageValidation.setImage(new Image("danger.png"));
            nameImageValidation.setVisible(true);
        }
    } else {
        name.getStyleClass().removeIf(style -> style.equals("error-class"));
        nameImageValidation.setVisible(false);
    }

    if (password.getText.equals("") && password.getText().isEmpty()) {
        if (!password.getStyleClass().contains("error-class")) {
            password.getStyleClass().add("error-class");
            passwordImageValidation.setImage(new Image("danger.png"));
            passwordImageValidation.setVisible(false);
        }
    } else {
        password.getStyleClass().removeIf(style -> style.equals("error-class"));
        passwordImageValidation.setVisible(false);
    }

    if (email.getText.equals("") && email.getText().isEmpty()) {
        if (!email.getStyleClass().contains("error-class")) {
            email.getStyleClass().add("error-class");
            emailImageValidation.setImage(new Image("danger.png"));
            emailImageValidation.setVisible(false);
        }
    } else {
        email.getStyleClass().removeIf(style -> style.equals("error-class"));
        emailImageValidation.setVisible(false);
    }

    if (country.getText.equals("") && country.getText().isEmpty()) {
        if (!country.getStyleClass().contains("error-class")) {
            country.getStyleClass().add("error-class");
            countryImageValidation.setImage(new Image("danger.png"));
            countryImageValidation.setVisible(false);
        }
    } else {
        country.getStyleClass().removeIf(style -> style.equals("error-class"));
        countryImageValidation.setVisible(false);
    }

    if(emailValidation() && passwordValidation() && fieldsValidation()) {
        User user = new User(name.getText(), email.getText(), password.getText(), country.getText());

        int insertStatus = UserController.insertUser(user);

        Timestamp timestamp = new Timestamp(System.currentTimeMillis());

        if (insertStatus > 0) {
            int updateStatus = UserController.updateTime(email.getText(), timestamp.toString());

                if(updateStatus) {
                    // Go to Login Page
                }
        } else {
            showAlert(); // Error Message
        }
    } else {
        showAlert(); // Error Message
    }
}

这里是validateEmail代码。当用户键入电子邮件时执行。当释放键并在键入后执行此操作时触发,字符必须等待一段时间,然后出现下一个字符并转到...

private void validateEmail(KeyEvent event) {
    boolean status = UserController.emailAvailability(email.getText());

    if (!status) {
        email.getStyleClass().removeIf(style -> style.equals("success-class"));
        emailImageValidation.setImage(new Image("safe.png"));
        emailImageValidation.setVisible(true);
    } else {
        email.getStyleClass().removeIf(style -> style.equals("error-class"));
        emailImageValidation.setImage(new Image("danger.png"));
        emailImageValidation.setVisible(true);
    }
}

我正在使用JavaFX构建应用程序。应用程序对MySQL数据库执行一些CRUD操作。所以目前,我有2个功能。用户注册。电子邮件验证(检查电子邮件是否已经...

mysql javafx keyevent actionevent
1个回答
0
投票

当您从GUI触发功能时,将在主线程中执行。现在,这些调用已阻塞,这意味着在它们返回之前,主线程无法更新GUI。

© www.soinside.com 2019 - 2024. All rights reserved.