2015-10-06 76 views
0
public class Pragrassbar extends JFrame implements MouseListener { 

    JProgressBar jb; 
    int i = 0, num = 0; 
    JButton jbt; 
    JLabel jl; 

    Pragrassbar() { 
     setSize(400, 400); 

     setLayout(new FlowLayout()); 
     jbt = new JButton("Start"); 
     jl = new JLabel("Click Start!"); 

     jb = new JProgressBar(0, 2000); 
     jb.setValue(0); 
     jb.setStringPainted(true); 
     jbt.addMouseListener(this); 
     add(jbt); 
     add(jb); 
     add(jl); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void mouseClicked(MouseEvent me) { 

     jl.setText("downloading....."); 

     jbt.setEnabled(false); 

     try { 

      while (i <= 2000) { 

       jb.setValue(i); 
       jb.paintImmediately(0, 0, 200, 25); 
       i = i + 40; 

       Thread.sleep(30); 

      } 
      jl.setText("download complete"); 
      jbt.setEnabled(true); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     Pragrassbar m = new Pragrassbar(); 
     m.setVisible(true); 

    } 

的setText()下的MouseListener接口的mouseClicked功能不正常 雖然它的工作原理,我已經使用的setText()中的mouseClicked不工作()函數

+0

也許是因爲它沒有被重新繪製,因爲你在while循環中保持執行你的代碼。 –

回答

3

Thread.sleep代碼後while循環()的原因事件調度線程(EDT)進入休眠狀態,這意味着直到循環代碼執行完畢,GUI才能重新進行自我刷新。

不要使用Thread.sleep。相反,長時間運行的代碼應該在單獨的線程中執行,因此您不會阻止EDT。你應該使用一個SwingWorker這個。

閱讀Swing教程中有關Concurrency的部分,以獲取有關此方法的更多信息和工作示例。

您也可以閱讀有關How to Use Progress Bars的部分,以獲取正確的方法。

+0

謝謝你@camickr – chris

+0

setEnabled(false)在循環之前如何工作?它在while循環開始之前禁用按鈕 – chris

+0

@camickr paint立即必須從EDT中調用,否則RepaintManager可以鎖定可見的Swing GUI,它不能從鼠標/鍵事件刷新,repaint()不起作用,要鎖定永遠... – mKorbel