[英]Update Java Gui Using SwingWorker
下面是一個SwingWorker實例,它沒有像我期望的那樣更新Java GUI。
SwingWorker在按鈕的動作偵聽器內部實現。 定義循環的min
和max
都是“ final int”,它們對於動作偵聽器而言是本地的。
SwingWorker應該在每次迭代時調用NQueens
對象的go()方法,該方法遞歸地找到n個皇后的所有解。 然后NQueens
對象的toString()
然后發布String,以便process()方法將更新jProgressBar
和jTextArea
。 但是,按下按鈕后什么也不會發生。 這是我應該如何實施密集的過程以及GUI組件更新嗎?
new SwingWorker <Void,String>()
{
private int totalPercent;
@Override
protected Void doInBackground()
{
int diff = max - min + 1;
int percent = 100;
if(diff != 0)
{
percent = 100/diff;
}
totalPercent = 0;
NQueens queens = new NQueens(min);
for(int j = min; j <= max; j++)
{
queens.go();
totalPercent += percent;
String newText = queens.toString();
publish(newText);
queens.nextSet();
}
isCalced = true;
return null;
}
protected void process(String results)
{
jTextArea2.append(results);
jProgressBar1.setValue(totalPercent);
jProgressBar1.repaint();
}
}.execute();
原因可能是您沒有實施正確的處理方法嗎? 我相信流程的正確簽名是
process(List<String> results) {
for(String result : results) {
jTextArea2.append(result);
}
}
關於更新進度條; doInBackground方法在單獨的線程中運行,而process方法在您從其調用工作程序的線程上運行。 您不應從doInBackground寫入totalPercent變量,而應從process()讀取它。 有關更多信息,請參見線程可見性 。 而是創建一個類似名為ProgressUpdateEvent的類,該類可以包含一個百分比值和一條消息。 這樣,您可以執行以下操作:
new SwingWorker <Void,ProgressUpdateEvent>() {
protected Void doInBackground() {
for (int i = 0; i <= 100; i++) {
publish(new ProgressUpdateEvent("At " + i + "% right now", i);
}
}
protected void process(List<ProgressUpdateEvent> events) {
for (ProgressUpdateEvent event : events) {
jTextArea2.append(event.getMessage());
jProgressBar1.setValue(event.getPercent());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.