2013-10-05 24 views
0

好日子的JFrame冻结按钮点击后,有权向被强制终止

我还在学校学习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

我希望有人能帮帮我!拼命解决这个烦人的问题。

+3

1)不要阻塞EDT(Event Dispatch Thread) - 当发生这种情况时GUI将“冻结”。而不是调用'Thread.sleep(n)'实现一个Swing'Timer'来重复执行任务,或者一个'SwingWorker'执行长时间运行的任务。有关更多详细信息,请参见[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 2)*“亲切的问候,布兰登”*噪音,离开它。 –

+1

[聊天程序冻结JFrame]的可能重复(http://stackoverflow.com/questions/16718198/chat-program-freezes-jframe)或[this one](http://stackoverflow.com/q/17627104/418556 )或[this one](http://stackoverflow.com/q/14305747/418556)(本身是[this one]的副本(http://stackoverflow.com/q/14271902/418556)).. –

+1

* “......有用的知道这个JFrame是什么样子的,你会更好地理解为什么我的代码是这样的,希望是这样。”*其实我之前提到的所有内容都是标题的前两个单词(JFrame冻结..)和SQL标记。这足以确定这里可能的罪魁祸首。 –

回答

0

经过失败的尝试,试图纠正的事情我没有真的明白,或者认为是错误的第一位,我终于发现我的问题。所发生的一切就是在我的JFrame属性中,我将这个窗口设置为始终最高。当我点击应用按钮时,框架只显示冻结,因为成功显示JOptionPane,只有后面的 GUI,所以我无法回应它。禁用“始终在最上面”选项后,它现在可以完美工作。

感谢所有的建议,但! :)