GUI 因 SwingWorker 线程中的长 运行 任务而冻结
GUI freezes with long running task in a SwingWorker Thread
当用户单击 GUI 应用程序中的按钮时,我有一个很长的 运行ning 任务绞车执行:
simplfyButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
simplfyAllText();
}//mouse evebt
});
simplfyAlltext() 方法执行一些 GUI 调用,然后是一个很长的 运行ning 任务,所以我把它放在 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();
}
即使 运行ning 后台任务在 SwingWorker 线程上 运行,GUI 在其执行期间仍然冻结,并且 SwingWorker.process 方法的进度不明显更新进度条。
任何意见表示赞赏。
sw.run();
您应该使用:
sw.execute();
在另一个线程上开始执行。
阅读有关 Concurrency 的 Swing 教程部分,了解更多信息和工作示例。
当用户单击 GUI 应用程序中的按钮时,我有一个很长的 运行ning 任务绞车执行:
simplfyButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
simplfyAllText();
}//mouse evebt
});
simplfyAlltext() 方法执行一些 GUI 调用,然后是一个很长的 运行ning 任务,所以我把它放在 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();
}
即使 运行ning 后台任务在 SwingWorker 线程上 运行,GUI 在其执行期间仍然冻结,并且 SwingWorker.process 方法的进度不明显更新进度条。 任何意见表示赞赏。
sw.run();
您应该使用:
sw.execute();
在另一个线程上开始执行。
阅读有关 Concurrency 的 Swing 教程部分,了解更多信息和工作示例。