2015-10-06 2 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() не функционирует в соответствии с функцией mouseClicked интерфейса MouseListener , хотя он работает после того, как время цикла, что я использовалSetText() не работает в mouseClicked функции()

+0

Возможно, потому что он не перерисовывается, поскольку вы выполняете выполнение кода внутри цикла. –

ответ

3

The Thread.sleep() причины Thread Dispatch Thread (EDT), чтобы спать, что означает, что GUI не может перерисовываться до тех пор, пока цикл цикла не будет завершен.

Не используйте Thread.sleep. Вместо этого длинный код должен выполняться в отдельном потоке, поэтому вы не блокируете EDT. Вероятно, вы должны использовать для этого SwingWorker.

Для получения дополнительной информации и рабочих примеров по этому подходу ознакомьтесь с разделом из учебника Swing по телефону Concurrency.

Вы также можете прочитать раздел о How to Use Progress Bars для правильного способа сделать это.

+0

thank u @camickr – chris

+0

how is SetEnabled (false), работающий до цикла? он отключает кнопку до начала цикла while – chris

+0

@camickr paintImmediately необходимо вызывать из EDT, иначе RepaintManager может блокировать видимый графический интерфейс Swing, он не может быть обновлен с событий мыши/ключа, repaint() не работает, чтобы заблокировать навсегда ... – mKorbel

Смежные вопросы