0

我試圖實現自動滾動進度條。問題是,我無法阻止它開始。但是在逐步調試期間,並且僅在調試期間,它工作正常。運行期間無法停止線程,但正在調試

這是我的代碼片段。任何幫助將不勝感激。

package test; 

import javax.swing.*; 

public final class MyTest{ 
private boolean isvisible = false; 
private JProgressBar progressbar = new JProgressBar(); 
/** 
* thread of automatic rolling progress-bar 
*/ 
private Thread proT = new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
    isvisible = true; 
    progressbar.setVisible(true); 
    while(true){ 
     progressBar.setValue((progressBar.getValue() + 20)%100); 
     System.out.println(progressBar.getValue()); 
     try{ 
     Thread.sleep(500); 
     }catch(InterruptedException e){ 
     e.printStackTrace(); 
     } 
     if(!isvisible){ 
     progressbar.setVisible(false); 
     break; 
     } 
    } 
    } 
}); 
/** 
* constructor 
*/ 
public MyTest(){ 
    //initiate GUI 
} 
/** 
* show an automatic rolling progress-bar 
*/ 
public void showProgressBar(){ 
    proT.start(); 
} 

/** 
* stop/veil the progress-bar 
*/ 
public void veilProgressBar(){ 
    isvisible = false; 
} 
} 
+0

爲了儘快獲得更好的幫助,請發佈[MCTaRE](http://stackoverflow.com/help/mcve)(最小完整測試和可讀示例)。 –

+0

注意:GUI更新應在EDT上執行,而我們絕不應導致EDT休眠。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

你是如何阻止它的? –

回答

3

有問題的整體筏這裏:

  1. 你從沒有在美國東部時間線程進行Swing GUI更新。

  2. 您的隱形變量不是易變的,因此從一個線程創建的更改可能無法從另一個線程看到。

  3. 雖然(真)睡在一個線程通常是不好的設計。

您應該在這裏使用一個SwingTimer來調度每個X來執行更新。當您需要停止更新時,只需取消SwingTimer並隱藏控件。隱藏需要從EDT完成,儘管您可能需要執行SwingUtilities.invokeLater

可能還有更多,但這就是我迄今爲止所看到的。

0

AFAIK可見性變量應該是其他線程至少volatile能夠注意到它已經改變了。你不做任何同步,所以價值不會得到更新。