【问题标题】:JFrame Freezes After Button Click, Has To Be Forcibly TerminatedJFrame在按钮单击后冻结,必须强制终止
【发布时间】:2013-10-05 16:29:05
【问题描述】:

美好的一天

我还在学校学习 Java 编程,并且我一直在做一个项目。一切正常,但是我的程序中允许用户更改其登录凭据的一项功能不再正常运行。我不记得改变任何东西,它以前工作得很好。

当我单击执行 SQL 查询以更改数据库中的用户名和密码字段值的“应用”按钮时,就会出现问题。 JFrame 冻结,我必须通过 WTM 强行终止它。另外需要注意的是,在控制台中,我收到一条红色消息:

Java 结果:-805306369

它每次都具有相同的值。我做了一些谷歌搜索,我发现像冻结这样的问题是由循环错误引起的,但据我所知,我没有任何代码的这个特定部分。

如果有人能帮助我,我将不胜感激!把我的头发拉出来。

下面是我的“应用”按钮代码,以及 SQL 查询。

private void btnApplyActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            if (txtNewUsername.equals("")) {
                labelFlagUsername.setVisible(false);
                JOptionPane.showMessageDialog(this, "You Need To Fill In The New Username Field", null, JOptionPane.ERROR_MESSAGE);
                System.out.println("You Need To Fill In The New Username Field");
            } else if (txtNewPassword.equals("")) {
                labelFlagPassword.setVisible(false);
                JOptionPane.showMessageDialog(this, "You Need To Fill In The New Password Field", null, JOptionPane.ERROR_MESSAGE);
                System.out.println("You Need To Fill In The New Password Field");
            } else {
                UN = txtNewUsername.getText();//Gets value that user entered into field
                PW = txtNewPassword.getText();//Gets value that user entered into field
                DM.editLoginDetails(UN, PW);//Executes SQL query editLoginDetails
            }

        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(this, e.getMessage(), null, JOptionPane.ERROR_MESSAGE);
            System.out.println(e.getMessage());
        }
        txtCurrentUsername.setText("   " + DM.getUsername(UN));
        txtCurrentPassword.setText("   " + DM.getPassword(PW));
        String temp = "";
        txtNewPassword.setText(temp);
        txtNewUsername.setText(temp);
    }

SQL 查询:

public String editLoginDetails(String UN, String PW)
    {

        try {
            Statement st = con.createStatement();
            String query = "UPDATE Users SET Username = '" + UN + "',Password = '" + PW + "';";
            st.execute(query);
            ResultSet rs = st.getResultSet();
            JOptionPane.showMessageDialog(null, "Your login details were changed successfully!");
            System.out.println("Your login details were changed successfully!");
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getMessage());
            System.out.println(e.getMessage());
        }
        return "Your login details were changed successfully!";
    }

最后,我认为知道这个 JFrame 长什么样会很有用。希望您能更好地理解为什么我的代码是这样的。

http://tinypic.com/r/ao9udg/5

我希望有人可以帮助我!急于解决这个烦人的问题。

【问题讨论】:

  • 1) 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 会“冻结”。而不是调用Thread.sleep(n) 实现一个摆动Timer 用于重复任务或一个SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 2) “亲切的问候,布兰登” 噪音,别说了。
  • Chat program freezes JFramethis onethis one 的可能重复项(本身是 this one 的重复项)..
  • "..有助于了解这个 JFrame 的样子。希望您能更好地理解为什么我的代码是这样的。"在我评论之前注意到的是标题的前两个单词(JFrame freezes..)和 SQL 标记。这足以确定这里可能的罪魁祸首。
  • 不一定相关,但您应该真正学习准备好的语句(因为如果密码包含引号,您的查询将失败),并且您的查询会更新所有用户的名称和密码!此外,查询末尾不应有分号。
  • @JB Nizet:只有一个用户,所以不用担心:)

标签: java sql swing button event-dispatch-thread


【解决方案1】:

在尝试纠正我不真正理解或认为错误的事情失败后,我终于发现了我的问题。所发生的只是在我的 JFrame 属性中,我将此窗口设置为始终位于顶部。当我单击应用按钮时,框架似乎只冻结了,因为正在显示成功的 JOptionPane,只是它在 GUI 后面,所以我无法响应它。禁用“始终在顶部”选项后,它现在可以完美运行。

感谢所有建议! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多