簡體   English   中英

使用SwingWorker更新Java Gui

[英]Update Java Gui Using SwingWorker

下面是一個SwingWorker實例,它沒有像我期望的那樣更新Java GUI。

SwingWorker在按鈕的動作偵聽器內部實現。 定義循環的minmax都是“ final int”,它們對於動作偵聽器而言是本地的。

SwingWorker應該在每次迭代時調用NQueens對象的go()方法,該方法遞歸地找到n個皇后的所有解。 然后NQueens對象的toString()然后發布String,以便process()方法將更新jProgressBarjTextArea 但是,按下按鈕后什么也不會發生。 這是我應該如何實施密集的過程以及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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM