2016-03-10 56 views
0

我正在嘗試爲Swing中的某些方法處理添加進度條。我想在方法開始時同時開始進度,並在結束時結束。我在網上找到了使用SwingWorker並分配任務的示例。然而,在我的情況下,我想在按鈕點擊時執行相同的操作。附於btnTest.addActionListener(this);並在actionPeformed以下執行。我嘗試了多種方式來同時運行兩個線程,但都沒有按照需要運行,即並行運行。或者酒吧掛起,直到按下按鈕被釋放,然後進度條開始。任何人都可以提出一種方法來解決這個問題?同時在內部運行線程執行進度條僅顯示方法的進程執行

public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == btnTest) { 

     >>> 
     1. Add progress BAR thread 1 
     2. call the method for with progress bar should start thread 2 
     3. start both thread simultaneously 
     4. End progress BAR 
     >>> 
     } 
} 
+2

*在執行搖擺工人的方法:「我已經找到樣本過網使用'SwingWorker'並分配任務。」 *是的,就是這樣它應該完成。 *「但是,就我而言,我希望在按鈕單擊時執行相同的操作。」*可以在按鈕單擊時調用它。如果你無法處理這個問題,我建議編輯添加你最佳嘗試的[mcve]。 –

+0

我同意。我真的堅持調用兩個線程同時運行。也許我無法理解它。必須進一步研究並刪除我現在的代碼中的缺陷。並感謝您的回覆。你有算法的例子嗎?你建議! – yeppe

+1

*「您是否有示例示例」?SO既不是代碼生成機器,也不是搜索引擎的替代品,但請參見[Swing中的併發:工作線程和SwingWorker:具有臨時結果的任務](https:// docs .oracle.com/javase/tutorial/uiswing/concurrency/interim.html)作爲開始。 –

回答

3

看看一個SwingWorker

我要你的基礎知識展示給使用一個,然後讓你用進度條實現它。

SwingWorker<Void, Integer> randomWorker = new SwingWorker<Void, Integer>() 
{ 
    @Override 
    protected Void doInBackground() throws Exceptio 
    { 
     for (int i = 0; i <= 5; i++) 
     { 
      //Generate a bunch of numbers 
      int x = 50 * i; 

      //Pause in between 
      Thread.sleep(100); 

      //Store them in the 'chunks' list 
      publish(x); 
     } 

     return null; 
    } 

    @Override 
    protected void process(List<Integer> chunks) 
    { 
     for(int num : chunks) 
     { 
      //Get the numbers in the 'chunks' list 
      //To use wherever/however you want 
      label.setText(String.valueOf(num)); 
     } 
    } 

    @Override 
    protected void done() 
    { 
     //Something to do when everything is done 
     label.setText("Finished"); 
    } 
}; 

然後調用您的actionPerformed()

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    randomWorker.execute(); 
} 
+0

感謝Jonah回覆這個方法。我想擺脫出版x的循環。相反,我只想調用方法來運行a)background - >實際工作完成b)foreground - > progressBAr show ..但是我看到一個異常,無論我放在doInBackgroud中運行但是process方法都不起作用。 .something like this .... protected void void doInBackground()throws Exception {SwingProgressBarExample.mainit(); 返回null; } protected void process(List chunk) { doTaskSecondHere(); } ................任何想法這裏怎麼回事。我應該發佈什麼! – yeppe

+0

@yeppe您將要設置您的進度條的最小值和最大值,然後創建某種函數,根據您在處理中的距離,返回一個數字。然後,您應該發佈該數字並在流程方法中檢索該數字,並在那裏更新進度欄。 – Jonah

+0

您也可以使用[Indeterminate](http://www.java2s.com/Tutorial/Java/0240__Swing/UsinganIndeterminateJProgressBar.htm)'JProgressBar'並在done函數中將其可見性設置爲false – Jonah