简体   繁体   English

GUI 在 SwingWorker 线程中因长时间运行的任务而冻结

[英]GUI freezes with long running task in a SwingWorker Thread

I have a long running task winch executes when the user clicks a button in a GUI application:当用户单击 GUI 应用程序中的按钮时,我会执行长时间运行的任务绞盘:

simplfyButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {


                simplfyAllText();
            }//mouse evebt
        });

The simplfyAlltext() method performs some GUI calls then a long running task, so I have placed this is SwingWorker: simplfyAlltext() 方法执行一些 GUI 调用,然后执行长时间运行的任务,因此我将其放置为 SwingWorker:

private void simplfyAllText() {

        /*
         * User has imported a text document for simplfying Depending on the size of the
         * document this could be time consuming So we will perform this on a
         * SwingWorker thread
         */

        // If user selects 'Simplfy' before any import is done
        if (!clearTextArea) {
            message_textArea.setText("");
            clearTextArea = true;
            displayMessage("You must import your text doucument to simplfy.", "Notice!");
            return;
        } else if (message_textArea.getText().length() <= 20) {
            displayMessage("You must import your text doucument to simplfy.", "Notice!");
            return;
        }

        // Set up stuff outside the worker thread
        exchangedText.setText("");
        progressBar.setIndeterminate(false);
        progressBar.setStringPainted(true);
        progressBar.setVisible(true);
        message_textArea.setEditable(false);

        // Create our worker to all heavy tasks off the event dispatch thread
        SwingWorker<String, Integer> sw = new SwingWorker<String, Integer>() {

            String simplifiedText = "";

            @Override
            protected String doInBackground() throws Exception {
                // Simplfy the text form message TA
                int size = message_textArea.getText().length();

                for (int i = 0; i < size; i++) {
                    publish(i);
                }
                simplifiedText = textSimplfier.simplyFullText(message_textArea.getText());
                return "finished";

            }

            @Override
            protected void process(List<Integer> chunks) {
                // define what the event dispatch thread
                // will do with the intermediate results received
                // while the thread is executing

                for (int val : chunks) {
                    progressBar.setValue(val);
                    countButton.setText(Integer.toString(val));
                    System.out.println("PROCESS : " + val);
                }

            }

            @Override
            protected void done() {
                // this method is called when the background
                // thread finishes execution
                outPut_TextArea.setText(simplifiedText);
                String exchanged = textSimplfier.getSwappedWords().toString();
                exchangedText.setText(exchanged);
                // remove 1/3 for : between words
                String wordsWithoutHTML = "";
                try {
                    wordsWithoutHTML = exchangedText.getDocument().getText(0, exchangedText.getDocument().getLength());
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                int noExchanged = ((wordsWithoutHTML.length() / 3) * 2);
                int noOfWords = message_textArea.getText().length();
                keyWord_TextField.setText(
                        "Complete!. " + noExchanged + "/" + noOfWords + " simplfied. Click /'Clear/' to continue.");

            }
        };

        sw.run();
    }

Even though the long running background task is run on a SwingWorker thread the GUI still frezzes during its execution, and the progress from the SwingWorker.process method does not appar to update the ProgressBar.即使长时间运行的后台任务在 SwingWorker 线程上运行,GUI 在其执行期间仍然冻结,并且来自 SwingWorker.process 方法的进度似乎无法更新 ProgressBar。 Any input appreciated.任何输入表示赞赏。

sw.run();

You should be using:你应该使用:

sw.execute();

To start execution on another Thread.在另一个线程上开始执行。

Read the section from the Swing tutorial on Concurrency for more information and working examples.有关更多信息和工作示例,请阅读 Swing 教程中关于并发的部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM