有人可以帮助我为我的无响应jbutton实现线程吗?我想使用pepraredStatement插入数据库。但是,每当我添加数据库部分(connection和pepraredStatement)时,“ UPLOAD”按钮都不会响应。但是当我删除与数据库有关的任何东西时,我所有的按钮都在工作。您可以在此处找到代码http://pastebin.com/euKdWhr2

我将非常感谢任何帮助或建议。我已经对该线程进行了解释,但是我仍然不能将其包含在我的代码中。

public void actionPerformed(ActionEvent ev)
        {
            String file = fileField.getText();
            SetGetQuestionFileName pattern = new SetGetQuestionFileName(file);
                ConnectToDatabase database = new ConnectToDatabase();
            try
            {

            ///////// check whether textfile is empty or not

            if( ev.getActionCommand().equals("UPLOAD"))
            {
                if(fileField.getText().isEmpty())
                {
                    JOptionPane.showMessageDialog(null,"File field can not be empty!!! Please try again.","ALERT", JOptionPane.ERROR_MESSAGE);
                }
                else
                    {
                        File fi = new File(fileField.getText());
                        ////////////////  perform upload

                        try
                            {

                    String sql = "INSERT INTO testsystem.questionnaire (category_questions, questions, correct_answer)" + "VALUES (?, ?, ?)";

                    PreparedStatement st =  null;

                    Connection dbconnection = database.getConnection();

                    st = dbconnection.prepareStatement(sql);

                                    if(fi.getAbsoluteFile().exists())
                                    {
                                        List<String> lines = Files.readAllLines(Paths.get(fileField.getText()), Charset.defaultCharset());


                                        for (int i = 0; i < lines.size(); i+=10)
                                            {
                                                    String category = lines.get(i);
                                                    System.out.println(category);
                                                    String question = lines.get(i+1);
                                                   System.out.println(question);

                                                    String answers =
                                                                    lines.get(i+2)+System.lineSeparator()
                                                                    +lines.get(i+3)+System.lineSeparator()
                                                                    +lines.get(i+4)+System.lineSeparator()
                                                                    +lines.get(i+5);
                                                    System.out.println(answers);

                                                    String correct = lines.get(i+7);
                                                    System.out.println("correct answer is: "+correct);
                                                    System.out.println("----------------");


                                    st.setString(1, category);
                                    st.setString(2, answers);
                                    st.setString(3, correct);
                                    st.executeUpdate();

                                        }

                                        JOptionPane.showMessageDialog(null,"File has been successfully uploaded in the database.","NOTIFCATION",JOptionPane.INFORMATION_MESSAGE);
                                    }
                else

                        JOptionPane.showMessageDialog(null,"File could not be found. Please try again","ALERT",JOptionPane.ERROR_MESSAGE);
                }

                        catch(SQLException ex)
                    {

                    }

                    catch(Exception ex)
                    {

                    }

最佳答案

强烈建议执行操作时封装实际完成工作的代码。在您的情况下,它是数据库(称为DBThread)。对您而言有用的是,将按钮分成3个部分(起初听起来太大,但很有意义),因此按钮不会无响应。所以你有


操作(调用DBThreadProgress)
DBThreadProgress(这是一个在末尾具有联接并将调用DBThread的线程)
DBThread(这是工作)


因此,前面提到的DBThread是您的业务逻辑。该Action调用一个进度线程,您可以在其中将gif图像放置在面板上,该图像显示出最终用户在后台运行的内容。这个progressThread还允许您等待DBthread完成,以便您可以将结果告知最终用户。我通常在开始时将按钮设置为setEnable(false),将按钮设置为setEnable(true),以便用户知道他无法单击两次。

希望这可以帮助 :-)

07-27 13:17