【问题标题】: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) {}?如果出了问题,您不想知道出了什么问题吗?

标签: java mysql swing jdbc swingworker


【解决方案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();似乎
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多