[英]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.