1  import javax.swing.*;
  2  import java.awt.*;
  3  import java.awt.event.*;
  4  
  5  public class SwingWorkerDemo extends JApplet {
  6    private JButton jbtComputeWithSwingWorker = new JButton("Compute");
  7    private JTextField jtfLimit1 = new JTextField(8);
  8    private JTextField jtfResult1 = new JTextField(6);
  9  	private JButton jbtCompute = new JButton("Compute");
 10  	private JTextField jtfLimit2 = new JTextField(8);
 11  	private JTextField jtfResult2 = new JTextField(6);
 12  	
 13  	public SwingWorkerDemo() {
 14      JPanel panel1 = new JPanel(new GridLayout(2, 1));
 15      panel1.setBorder(BorderFactory.createTitledBorder(
 16        "Using SwingWorker"));
 17      JPanel panel11 = new JPanel();
 18      panel11.add(new JLabel("The number of prime numbers <= "));
 19      panel11.add(jtfLimit1);
 20      panel11.add(new JLabel("is"));
 21      panel11.add(jtfResult1);
 22      JPanel panel12 = new JPanel();
 23      panel12.add(jbtComputeWithSwingWorker);
 24      panel1.add(panel11);
 25      panel1.add(panel12);
 26  		
 27      JPanel panel2 = new JPanel(new GridLayout(2, 1));
 28      panel2.setBorder(BorderFactory.createTitledBorder(
 29        "Without Using SwingWorker"));
 30      JPanel panel21 = new JPanel();
 31      panel21.add(new JLabel("The number of prime numbers <= "));
 32      panel21.add(jtfLimit2);
 33      panel21.add(new JLabel("is"));
 34      panel21.add(jtfResult2);
 35      JPanel panel22 = new JPanel();
 36      panel22.add(jbtCompute);
 37      panel2.add(panel21);
 38      panel2.add(panel22);
 39  		
 40  		setLayout(new GridLayout(1, 2));
 41  		add(panel1);
 42  		add(panel2);
 43  		
 44  		jbtComputeWithSwingWorker.addActionListener(new ActionListener() {
 45  		  @Override
 46  			public void actionPerformed(ActionEvent e) {			
 47  				new ComputePrime(Integer.parseInt(jtfLimit1.getText()), 
 48  					jtfResult1).execute(); // Execute SwingWorker
 49  			}
 50  		});
 51  		
 52  		jbtCompute.addActionListener(new ActionListener() {
 53  		  @Override
 54  			public void actionPerformed(ActionEvent e) {			
 55  				int count = ComputePrime.getNumberOfPrimes(
 56  					Integer.parseInt(jtfLimit2.getText()));
 57  				jtfResult2.setText(count + "");
 58  			}
 59  		});	
 60  	}
 61  	
 62  	/** Task class for SwingWorker */
 63  	static class ComputePrime extends SwingWorker<Integer, Object> {
 64  		private int limit; 
 65  		private JTextField result; // Text field in the UI
 66  		
 67  		/** Construct a runnable Task */
 68  		public ComputePrime(int limit, JTextField result) {
 69  			this.limit = limit;
 70  			this.result = result;
 71  		}
 72  		
 73  		/** Code run on a background thread */
 74  		protected Integer doInBackground() {
 75  			return getNumberOfPrimes(limit);
 76  		}
 77  		
 78  		/** Code executed after the background thread finishes */
 79  		protected void done() {
 80  			try {
 81  			  result.setText(get().toString()); // Display in text field
 82  			}
 83  			catch (Exception ex) {
 84  			  result.setText(ex.getMessage()); 
 85  			}
 86  		}	
 87  
 88  		/** Return the number of primes <= limit */
 89  		public static int getNumberOfPrimes(int limit) {		
 90  	    int count = 0; // Count the number of prime numbers
 91  	    int number = 2; // A number to be tested for primeness
 92  
 93  	    // Repeatedly find prime numbers
 94  	    while (number <= limit) {
 95  	      // Print the prime number and increase the count
 96  	      if (isPrime(number)) {
 97  	        count++; // Increase the count
 98  	      }
 99  
100  	      // Check if the next number is prime
101  	      number++;
102  	    }
103  	    
104  	    return count;
105  	  }
106  
107  	  /** Check whether number is prime */
108  	  private static boolean isPrime(int number) {
109  	    for (int divisor = 2; divisor <= number / 2; divisor++) {
110  	      if (number % divisor == 0) { // If true, number is not prime
111  	        return false; // number is not a prime
112  	      }
113  	    }
114  
115  	    return true; // number is prime
116  	  }
117  	}
118  	
119    public static void main(String[] args) {
120      SwingWorkerDemo applet = new SwingWorkerDemo();
121      JFrame frame = new JFrame();
122      frame.setTitle("SwingWorkerDemo");
123      frame.getContentPane().add(applet, BorderLayout.CENTER);
124      applet.init();
125      applet.start();
126      frame.pack();
127      frame.setLocationRelativeTo(null); // Center the frame
128      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
129      frame.setVisible(true);
130    }
131  }