1  import javax.swing.*;
  2  import java.awt.*;
  3  import java.awt.event.*;
  4  import java.beans.*;
  5  
  6  public class ProgressBarDemo extends JApplet {
  7    private JProgressBar jpb = new JProgressBar();
  8    private JTextArea jtaResult = new JTextArea();
  9    private JTextField jtfPrimeCount = new JTextField(8);
 10    private JButton jbtDisplayPrime = new JButton("Display Prime");
 11    
 12    public ProgressBarDemo() {   
 13      jpb.setStringPainted(true); // Paint the percent in a string
 14      jpb.setValue(0);
 15      jpb.setMaximum(100);
 16      
 17      jtaResult.setWrapStyleWord(true);
 18      jtaResult.setLineWrap(true);
 19      
 20      JPanel panel = new JPanel();
 21      panel.add(new JLabel("Enter the prime number count"));
 22      panel.add(jtfPrimeCount);
 23      panel.add(jbtDisplayPrime);
 24      
 25      add(jpb, BorderLayout.NORTH);
 26      add(new JScrollPane(jtaResult), BorderLayout.CENTER);
 27      add(panel, BorderLayout.SOUTH);
 28      
 29      jbtDisplayPrime.addActionListener(new ActionListener() {
 30        @Override
 31        public void actionPerformed(ActionEvent e) {      
 32          ComputePrime task = new ComputePrime(
 33            Integer.parseInt(jtfPrimeCount.getText()), jtaResult);
 34                  
 35          task.addPropertyChangeListener(new PropertyChangeListener() {
 36            public void propertyChange(PropertyChangeEvent e) {
 37              if ("progress".equals(e.getPropertyName())) {
 38                jpb.setValue((Integer)e.getNewValue());
 39              }
 40            }
 41          });
 42          
 43          task.execute(); // Execute SwingWorker
 44        }
 45      });
 46    }
 47    
 48    /** Task class for SwingWorker */
 49    static class ComputePrime extends SwingWorker<Integer, Integer> {
 50      private int count; 
 51      private JTextArea result; // Textarea in the UI
 52      
 53      /** Construct a runnable Task */
 54      public ComputePrime(int count, JTextArea result) {
 55        this.count = count;
 56        this.result = result;
 57      }
 58      
 59      /** Code run on a background thread */
 60      protected Integer doInBackground() {
 61        publishPrimeNumbers(count);
 62        
 63        return 0; // doInBachground must return a value
 64      }
 65  
 66      /** Override process to display published prime values */
 67      protected void process(java.util.List<Integer> list) {
 68        for (int i = 0; i < list.size(); i++) 
 69          result.append(list.get(i) + " ");
 70      }
 71      
 72      /** Publish the first n primes number */
 73      private void publishPrimeNumbers(int n) {    
 74        int count = 0; // Count the number of prime numbers
 75        int number = 2; // A number to be tested for primeness
 76  
 77        // Repeatedly find prime numbers
 78        while (count <= n) {
 79          // Print the prime number and increase the count
 80          if (isPrime(number)) {
 81            count++; // Increase the count
 82            setProgress(100 * count / n); // Update progress
 83            publish(number); // Publish the prime number
 84          }
 85  
 86          // Check if the next number is prime
 87          number++;
 88        }
 89      }
 90  
 91      /** Check whether number is prime */
 92      private static boolean isPrime(int number) {
 93        for (int divisor = 2; divisor <= number / 2; divisor++) {
 94          if (number % divisor == 0) { // If true, number is not prime
 95            return false; // number is not a prime
 96          }
 97        }
 98  
 99        return true; // number is prime
100      }
101    }
102    
103    public static void main(String[] args) {
104      ProgressBarDemo applet = new ProgressBarDemo();
105      JFrame frame = new JFrame();
106      frame.setTitle("ProgressBarDemo");
107      frame.getContentPane().add(applet, BorderLayout.CENTER);
108      applet.init();
109      applet.start();
110      frame.setSize(400, 200);
111      frame.setLocationRelativeTo(null); // Center the frame
112      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
113      frame.setVisible(true);
114    }
115  }