2012-06-29 2 views
1

Я просто пытаюсь перебирать цикл и обновлять значения JProgressBar внутри цикла, инициируя SwingUtilities.invokeLater .. но это только обновление после завершения. Ниже мой простой код:java апплет: обновление/обновление JProgressBar только при завершении

import java.awt.Color; 
import java.awt.Rectangle; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class ProgressBar extends JApplet { 
    JProgressBar pg = null; 
    JPanel panel = null; 
    JButton start = null; 
    int i; 

    public void init() { 
     pg = new JProgressBar(0, 100); 
     pg.setStringPainted(true); 
     this.setSize(1200, 600); 
     this.setLayout(null); 
     panel = new JPanel(); 
     panel.setLayout(null); 
     panel.setBackground(Color.white); 
     this.setContentPane(panel); 
     this.setVisible(true); 
     pg.setBounds(new Rectangle(630, 20, 150, 30)); 
     add(pg); 


     start = new JButton("start"); 
     start.setBounds(new Rectangle(330, 20, 200, 30)); 
     start.setBackground(Color.lightGray); 
     panel.add(start); 

     start.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       pg.setValue(0); 
       pg.setStringPainted(true); 

       for (i = 0; i <= 100; i = i + 1) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          try { 
           pg.setValue(i); 
           java.lang.Thread.sleep(100); 
          } catch (Exception e) {} 
         } 
        }); 
       } 
      } 
     }); 
    } 
} 

Как отразить Updation из progress bar в увеличивающимся, как это обновление только 100% после завершения цикла.

+2

'}});}}}};}}' Нет необходимости в этом уровне «источника сокращения». Читаемость лучше. Пожалуйста, используйте последовательный и логический отступ для кодовых блоков. –

+1

@AndrewThompson ok..Я буду помнить это в виду .. спасибо !! :) –

ответ

6

Вы должны обработать любые вычисления/обработки материала в отдельном потоке и обновления пользовательского интерфейса в Event диспетчерское Thread (EDT):

start.addActionListener (new ActionListener() 
    { 
     public void actionPerformed (ActionEvent e) 
     { 
      pg.setValue (0); 
      pg.setStringPainted (true); 
      new Thread (new Runnable() 
      { 
       public void run() 
       { 
        for (i = 0; i <= 100; i = i + 1) 
        { 
         SwingUtilities.invokeLater (new Runnable() 
         { 
          public void run() 
          { 
           pg.setValue (i); 
          } 
         }); 
         try 
         { 
          java.lang.Thread.sleep (100); 
         } 
         catch (Exception e) 
         { 
          // 
         } 
        } 
       } 
      }).start(); 

     } 
    }); 

Любые мыши/ключ и другие слушатели методы действия/всегда выполняются в поток EDT, поэтому вам нужно переместить свой код в отдельный поток. В противном случае вы будете выполнять все вычисления/обработку внутри потока EDT (и это заставляет UI застрять).

+1

хорошее предложение +1 – mKorbel

+0

@MikleGarin Большое спасибо за объяснение и код .. он работал очень хорошо! Еще раз спасибо .. –

4

Вы блокируете EDT (Event Dispatching Thread), поэтому индикатор выполнения не может обновить себя. Ваш for-loop будет вызывать 100 InvocationEvent на EventQueue. Эти 100 событий будут происходить в том порядке, в котором вы помещаете их в очередь. Когда вы обновляете значение, событие Event переадресации переносится на EventQueue, но это событие перерисовывается только после того, как все ваши InvocationEvent были выполнены.

  1. Никогда не кладите Thread.sleep внутри EDT (это блокирует пользовательский интерфейс и дает плохой пользовательский опыт)
  2. Поставьте длительные операции в SwingWorker
  3. Или использовать Swing timer для повторяющихся задач
+0

лучше описано +1 – mKorbel

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