保存到数据库使按钮无响应

Posted

技术标签:

【中文标题】保存到数据库使按钮无响应【英文标题】:Saving to database makes button unresponsive 【发布时间】:2015-01-11 14:14:47 【问题描述】:

美好的一天。我想使用 pepraredStatement 插入数据库。但是,每当我添加数据库部分(连接和 pepraredStatement)时,“上传”按钮就会无响应。但是当我删除与数据库相关的任何内容时,我所有的按钮都在工作。你可以在这里找到代码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)
                    

                    

【问题讨论】:

永远不要在不处理异常的情况下捕获异常。或者你重新抛出它们,或者至少记录它们。此外,不要在启动侦听器的线程中执行重要的逻辑;如果你的逻辑可能不是即时的,那么你应该启动一个不同的线程来处理它。 Swing 是单线程的,任何长时间运行或阻塞的代码都会阻止 UI 更新,请参阅 Concurrency in Swing 和 Worker Threads and SwingWorker 为什么会有catch(SQLException e) catch(Exception e) ?如果出了问题,您不想知道出了什么问题吗? 【参考方案1】:

actionPerformed() 方法由 ui 线程调用。如果您在此线程中执行长时间运行的任务,则 ui 将无响应,因为 ui 线程无法再进行 ui 工作,例如重新绘制 ui 或仅处理用户输入。

考虑使用SwingWorker 并阅读有关concurrency in java 的教程。

编辑

我去了建议的网站,但我真的不明白你所说的 SwingWorker 是什么意思。我还没有真正习惯线程呢

这是一个如何让SwingWorker 和长时间运行的后台任务工作的工作示例。

public class SwingWorkerExample  

    public static class ProgressSimulatorSwingWoker extends SwingWorker<Void, Void> 

        private BoundedRangeModel progressModel;

        public ProgressSimulatorSwingWoker(BoundedRangeModel progressModel) 
            this.progressModel = progressModel;
        

        @Override
        protected Void doInBackground() throws Exception 
            int start = 0;
            int end = 100;

            progressModel.setMinimum(start);
            progressModel.setMaximum(end);

            for (int i = start; i <= end; i++) 
                progressModel.setValue(i);
                Thread.sleep(50);
            
            return null;
        

    

    public static void main(String[] args) 
        JFrame jFrame = new JFrame("SwingWorker example");
        jFrame.setSize(640, 150);
        jFrame.setLocationRelativeTo(null); // center on screen
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        Container contentPane = jFrame.getContentPane();
        contentPane.setLayout(new BorderLayout());

        JProgressBar jProgressBar = new JProgressBar();
        final BoundedRangeModel model = jProgressBar.getModel();

        JButton jButton = new JButton("Simulate Progress");
        jButton.addActionListener(new ActionListener() 

            @Override
            public void actionPerformed(ActionEvent e) 
                ProgressSimulatorSwingWoker progressSimulatorSwingWoker = new ProgressSimulatorSwingWoker(model);
                progressSimulatorSwingWoker.execute();

            
        );

        contentPane.add(jProgressBar, BorderLayout.CENTER);
        contentPane.add(jButton, BorderLayout.SOUTH);

        jFrame.setVisible(true);
    

【讨论】:

我去了建议的网站,但我真的不明白你所说的 SwingWorker 是什么意思。我还没有真正习惯这个线程 @mkwilfreid 不客气...希望它能帮助您适应我们的需求 我真的希望如此,但我无法让它工作,我遇到了错误。我不能使用这个最终的 BoundedRangeModel model = uploadBtn.getModel();似乎

以上是关于保存到数据库使按钮无响应的主要内容,如果未能解决你的问题,请参考以下文章

ckeditor 使页面无响应

DLL 中的 Rtaudio 使程序无响应

vue-resource POST PC端正常,移动端无响应

UIButton按钮点击无响应处理方法

使引导容器大小变大会使页面无响应

system进程无响应,关闭不了,触屏不好使,啥原因?解决?