<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FSwing%2FSwingWorker</id>
		<title>Java Tutorial/Swing/SwingWorker - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FSwing%2FSwingWorker"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/SwingWorker&amp;action=history"/>
		<updated>2026-04-22T01:50:34Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/SwingWorker&amp;diff=3893&amp;oldid=prev</id>
		<title> в 17:44, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/SwingWorker&amp;diff=3893&amp;oldid=prev"/>
				<updated>2010-05-31T17:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 17:44, 31 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/SwingWorker&amp;diff=3894&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Swing/SwingWorker&amp;diff=3894&amp;oldid=prev"/>
				<updated>2010-05-31T15:32:33Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 14. extends generic SwingWorker ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *     documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS&lt;br /&gt;
 * IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.GridBagConstraints;&lt;br /&gt;
import java.awt.GridBagLayout;&lt;br /&gt;
import java.awt.Insets;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import javax.swing.BorderFactory;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.SwingWorker;&lt;br /&gt;
import javax.swing.border.Border;&lt;br /&gt;
public class Flipper extends JFrame implements ActionListener {&lt;br /&gt;
  private final GridBagConstraints constraints;&lt;br /&gt;
  private final JTextField headsText, totalText, devText;&lt;br /&gt;
  private final Border border = BorderFactory.createLoweredBevelBorder();&lt;br /&gt;
  private final JButton startButton, stopButton;&lt;br /&gt;
  private FlipTask flipTask;&lt;br /&gt;
  private JTextField makeText() {&lt;br /&gt;
    JTextField t = new JTextField(20);&lt;br /&gt;
    t.setEditable(false);&lt;br /&gt;
    t.setHorizontalAlignment(JTextField.RIGHT);&lt;br /&gt;
    t.setBorder(border);&lt;br /&gt;
    getContentPane().add(t, constraints);&lt;br /&gt;
    return t;&lt;br /&gt;
  }&lt;br /&gt;
  private JButton makeButton(String caption) {&lt;br /&gt;
    JButton b = new JButton(caption);&lt;br /&gt;
    b.setActionCommand(caption);&lt;br /&gt;
    b.addActionListener(this);&lt;br /&gt;
    getContentPane().add(b, constraints);&lt;br /&gt;
    return b;&lt;br /&gt;
  }&lt;br /&gt;
  public Flipper() {&lt;br /&gt;
    super(&amp;quot;Flipper&amp;quot;);&lt;br /&gt;
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    // Make text boxes&lt;br /&gt;
    getContentPane().setLayout(new GridBagLayout());&lt;br /&gt;
    constraints = new GridBagConstraints();&lt;br /&gt;
    constraints.insets = new Insets(3, 10, 3, 10);&lt;br /&gt;
    headsText = makeText();&lt;br /&gt;
    totalText = makeText();&lt;br /&gt;
    devText = makeText();&lt;br /&gt;
    // Make buttons&lt;br /&gt;
    startButton = makeButton(&amp;quot;Start&amp;quot;);&lt;br /&gt;
    stopButton = makeButton(&amp;quot;Stop&amp;quot;);&lt;br /&gt;
    stopButton.setEnabled(false);&lt;br /&gt;
    // Display the window.&lt;br /&gt;
    pack();&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  private static class FlipPair {&lt;br /&gt;
    private final long heads, total;&lt;br /&gt;
    FlipPair(long heads, long total) {&lt;br /&gt;
      this.heads = heads;&lt;br /&gt;
      this.total = total;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private class FlipTask extends SwingWorker&amp;lt;Void, FlipPair&amp;gt; {&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Void doInBackground() {&lt;br /&gt;
      long heads = 0;&lt;br /&gt;
      long total = 0;&lt;br /&gt;
      Random random = new Random();&lt;br /&gt;
      while (!isCancelled()) {&lt;br /&gt;
        total++;&lt;br /&gt;
        if (random.nextBoolean()) {&lt;br /&gt;
          heads++;&lt;br /&gt;
        }&lt;br /&gt;
        publish(new FlipPair(heads, total));&lt;br /&gt;
      }&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void process(List&amp;lt;FlipPair&amp;gt; pairs) {&lt;br /&gt;
      FlipPair pair = pairs.get(pairs.size() - 1);&lt;br /&gt;
      headsText.setText(String.format(&amp;quot;%d&amp;quot;, pair.heads));&lt;br /&gt;
      totalText.setText(String.format(&amp;quot;%d&amp;quot;, pair.total));&lt;br /&gt;
      devText.setText(String.format(&amp;quot;%.10g&amp;quot;, ((double) pair.heads)&lt;br /&gt;
          / ((double) pair.total) - 0.5));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    if (&amp;quot;Start&amp;quot; == e.getActionCommand()) {&lt;br /&gt;
      startButton.setEnabled(false);&lt;br /&gt;
      stopButton.setEnabled(true);&lt;br /&gt;
      (flipTask = new FlipTask()).execute();&lt;br /&gt;
    } else if (&amp;quot;Stop&amp;quot; == e.getActionCommand()) {&lt;br /&gt;
      startButton.setEnabled(true);&lt;br /&gt;
      stopButton.setEnabled(false);&lt;br /&gt;
      flipTask.cancel(true);&lt;br /&gt;
      flipTask = null;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        new Flipper();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 14. Progress Monitor and Swingworker ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *     documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS&lt;br /&gt;
 * IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Insets;&lt;br /&gt;
import java.awt.Toolkit;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.beans.PropertyChangeEvent;&lt;br /&gt;
import java.beans.PropertyChangeListener;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import javax.swing.BorderFactory;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JScrollPane;&lt;br /&gt;
import javax.swing.JTextArea;&lt;br /&gt;
import javax.swing.ProgressMonitor;&lt;br /&gt;
import javax.swing.SwingWorker;&lt;br /&gt;
public class ProgressMonitorDemo extends JPanel implements ActionListener,&lt;br /&gt;
    PropertyChangeListener {&lt;br /&gt;
  private ProgressMonitor progressMonitor;&lt;br /&gt;
  private JButton startButton;&lt;br /&gt;
  private JTextArea taskOutput;&lt;br /&gt;
  private Task task;&lt;br /&gt;
  class Task extends SwingWorker&amp;lt;Void, Void&amp;gt; {&lt;br /&gt;
    @Override&lt;br /&gt;
    public Void doInBackground() {&lt;br /&gt;
      Random random = new Random();&lt;br /&gt;
      int progress = 0;&lt;br /&gt;
      setProgress(0);&lt;br /&gt;
      try {&lt;br /&gt;
        Thread.sleep(1000);&lt;br /&gt;
        while (progress &amp;lt; 100 &amp;amp;&amp;amp; !isCancelled()) {&lt;br /&gt;
          // Sleep for up to one second.&lt;br /&gt;
          Thread.sleep(random.nextInt(1000));&lt;br /&gt;
          // Make random progress.&lt;br /&gt;
          progress += random.nextInt(10);&lt;br /&gt;
          setProgress(Math.min(progress, 100));&lt;br /&gt;
        }&lt;br /&gt;
      } catch (InterruptedException ignore) {&lt;br /&gt;
      }&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void done() {&lt;br /&gt;
      Toolkit.getDefaultToolkit().beep();&lt;br /&gt;
      startButton.setEnabled(true);&lt;br /&gt;
      progressMonitor.setProgress(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public ProgressMonitorDemo() {&lt;br /&gt;
    super(new BorderLayout());&lt;br /&gt;
    // Create the demo&amp;quot;s UI.&lt;br /&gt;
    startButton = new JButton(&amp;quot;Start&amp;quot;);&lt;br /&gt;
    startButton.setActionCommand(&amp;quot;start&amp;quot;);&lt;br /&gt;
    startButton.addActionListener(this);&lt;br /&gt;
    taskOutput = new JTextArea(5, 20);&lt;br /&gt;
    taskOutput.setMargin(new Insets(5, 5, 5, 5));&lt;br /&gt;
    taskOutput.setEditable(false);&lt;br /&gt;
    add(startButton, BorderLayout.PAGE_START);&lt;br /&gt;
    add(new JScrollPane(taskOutput), BorderLayout.CENTER);&lt;br /&gt;
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Invoked when the user presses the start button.&lt;br /&gt;
   */&lt;br /&gt;
  public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
    progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this,&lt;br /&gt;
        &amp;quot;Running a Long Task&amp;quot;, &amp;quot;&amp;quot;, 0, 100);&lt;br /&gt;
    progressMonitor.setProgress(0);&lt;br /&gt;
    task = new Task();&lt;br /&gt;
    task.addPropertyChangeListener(this);&lt;br /&gt;
    task.execute();&lt;br /&gt;
    startButton.setEnabled(false);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Invoked when task&amp;quot;s progress property changes.&lt;br /&gt;
   */&lt;br /&gt;
  public void propertyChange(PropertyChangeEvent evt) {&lt;br /&gt;
    if (&amp;quot;progress&amp;quot; == evt.getPropertyName()) {&lt;br /&gt;
      int progress = (Integer) evt.getNewValue();&lt;br /&gt;
      progressMonitor.setProgress(progress);&lt;br /&gt;
      String message = String.format(&amp;quot;Completed %d%%.\n&amp;quot;, progress);&lt;br /&gt;
      progressMonitor.setNote(message);&lt;br /&gt;
      taskOutput.append(message);&lt;br /&gt;
      if (progressMonitor.isCanceled() || task.isDone()) {&lt;br /&gt;
        Toolkit.getDefaultToolkit().beep();&lt;br /&gt;
        if (progressMonitor.isCanceled()) {&lt;br /&gt;
          task.cancel(true);&lt;br /&gt;
          taskOutput.append(&amp;quot;Task canceled.\n&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
          taskOutput.append(&amp;quot;Task completed.\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        startButton.setEnabled(true);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Create the GUI and show it. For thread safety, this method should be&lt;br /&gt;
   * invoked from the event-dispatching thread.&lt;br /&gt;
   */&lt;br /&gt;
  private static void createAndShowGUI() {&lt;br /&gt;
    // Create and set up the window.&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;ProgressMonitorDemo&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    // Create and set up the content pane.&lt;br /&gt;
    JComponent newContentPane = new ProgressMonitorDemo();&lt;br /&gt;
    newContentPane.setOpaque(true); // content panes must be opaque&lt;br /&gt;
    frame.setContentPane(newContentPane);&lt;br /&gt;
    // Display the window.&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    // Schedule a job for the event-dispatching thread:&lt;br /&gt;
    // creating and showing this application&amp;quot;s GUI.&lt;br /&gt;
    javax.swing.SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        createAndShowGUI();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 14. SwingWorker in Java 6 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.LayoutManager;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.beans.PropertyChangeEvent;&lt;br /&gt;
import java.beans.PropertyChangeListener;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JProgressBar;&lt;br /&gt;
import javax.swing.JScrollPane;&lt;br /&gt;
import javax.swing.JTextArea;&lt;br /&gt;
import javax.swing.SwingWorker;&lt;br /&gt;
public class Main{&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    final JProgressBar progressBar = new JProgressBar(0, 10);&lt;br /&gt;
    final CounterTask task = new CounterTask();&lt;br /&gt;
    task.addPropertyChangeListener(new PropertyChangeListener() {&lt;br /&gt;
      public void propertyChange(PropertyChangeEvent evt) {&lt;br /&gt;
        if (&amp;quot;progress&amp;quot;.equals(evt.getPropertyName())) {&lt;br /&gt;
          progressBar.setValue((Integer) evt.getNewValue());&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JButton startButton = new JButton(&amp;quot;Start&amp;quot;);&lt;br /&gt;
    startButton.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent e) {&lt;br /&gt;
        task.execute();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JButton cancelButton = new JButton(&amp;quot;Cancel&amp;quot;);&lt;br /&gt;
    cancelButton.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent e) {&lt;br /&gt;
        task.cancel(true);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    JPanel buttonPanel = new JPanel();&lt;br /&gt;
    buttonPanel.add(startButton);&lt;br /&gt;
    buttonPanel.add(cancelButton);&lt;br /&gt;
    JPanel cp = new JPanel();&lt;br /&gt;
    LayoutManager layout = new BoxLayout(cp, BoxLayout.Y_AXIS);&lt;br /&gt;
    cp.setLayout(layout);&lt;br /&gt;
    cp.add(buttonPanel);&lt;br /&gt;
    cp.add(progressBar);&lt;br /&gt;
    JFrame frame = new JFrame();&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    frame.setContentPane(cp);&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class CounterTask extends SwingWorker&amp;lt;Integer, Integer&amp;gt; {&lt;br /&gt;
  int DELAY = 1000;&lt;br /&gt;
  @Override&lt;br /&gt;
  protected Integer doInBackground() throws Exception {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int count = 10;&lt;br /&gt;
    while (!isCancelled() &amp;amp;&amp;amp; i &amp;lt; count) {&lt;br /&gt;
      i++;&lt;br /&gt;
      publish(new Integer[] { i });&lt;br /&gt;
      setProgress(count * i / count);&lt;br /&gt;
      Thread.sleep(DELAY);&lt;br /&gt;
    }&lt;br /&gt;
    return count;&lt;br /&gt;
  }   &lt;br /&gt;
  protected void process(List&amp;lt;Integer&amp;gt; chunks) {&lt;br /&gt;
      System.out.println(chunks);&lt;br /&gt;
  }&lt;br /&gt;
  @Override&lt;br /&gt;
  protected void done() {&lt;br /&gt;
    if (isCancelled())&lt;br /&gt;
      System.out.println(&amp;quot;Cancelled !&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      System.out.println(&amp;quot;Done !&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 14. Use SwingWorker to perform background tasks ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.FlowLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JOptionPane;&lt;br /&gt;
import javax.swing.SwingWorker;&lt;br /&gt;
public class Main extends JFrame {&lt;br /&gt;
  public Main() {&lt;br /&gt;
    this.setLayout(new FlowLayout());&lt;br /&gt;
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    JButton processButton = new JButton(&amp;quot;Start&amp;quot;);&lt;br /&gt;
    JButton helloButton = new JButton(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    processButton.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent event) {&lt;br /&gt;
        MyTask process = new MyTask();&lt;br /&gt;
        try {&lt;br /&gt;
          process.execute();&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
          e.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    helloButton.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent e) {&lt;br /&gt;
        JOptionPane.showMessageDialog(null, &amp;quot;Hello There&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    this.getContentPane().add(processButton);&lt;br /&gt;
    this.getContentPane().add(helloButton);&lt;br /&gt;
    this.pack();&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new Main();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyTask extends SwingWorker {&lt;br /&gt;
  protected Object doInBackground() throws Exception {&lt;br /&gt;
    Integer result = new Integer(0);&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
      result += i * 10;&lt;br /&gt;
      try {&lt;br /&gt;
        Thread.sleep(5000);&lt;br /&gt;
      } catch (Exception e) {&lt;br /&gt;
        e.printStackTrace();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>