Java Swing Tutorials - Herong's Tutorial Examples - Version 4.11, by Dr. Herong Yang
SwingWorker Example using "progress" Property
This section provides a tutorial example on how to use java.swing.SwingWorker class with the setProgress() method to update the 'progress' property value from the doInBackground() method. A PropertyChangeListener class must be implemented to catch the updated value of the 'progress' property in the dispatch thread.
Example 3: Update "progress" property and use it to show progress - This example shows you how to communicate the "progress" of a background task to a Dispatch thread. Only 1 method and 1 listener class need to be implemented:
Here is the source code of the example program, SwingWorkerUsingProgress.java:
/* SwingWorkerUsingProgress.java * Copyright (c) 2014, HerongYang.com, All Rights Reserved. */ import javax.swing.SwingWorker; import java.util.Random; import java.time.LocalTime; import java.beans.*; public class SwingWorkerUsingProgress extends SwingWorker<Object, Object> { int total = 100; int wait = 10; // Extending the SwingWorker class protected Object doInBackground() { logMessage("doInBackground() started"); int i = 0; Random r = new Random(); try { while (i<total) { Thread.sleep(wait); Integer n = new Integer(r.nextInt()); setProgress((100*(i+1))/total); i++; } } catch (Exception e) { e.printStackTrace(); } logMessage("doInBackground() ended"); return null; } // Launching my extended SwingWorker class public static void main(String[] a) { try { SwingWorker worker = new SwingWorkerUsingProgress(); dumpThreads(); worker.addPropertyChangeListener(new myListener()); worker.execute(); while (true) { dumpThreads(); Thread.sleep(200); } } catch (Exception e) { e.printStackTrace(); } } public static void dumpThreads() { System.out.println(LocalTime.now()+" Thread dump:"); Thread.currentThread().getThreadGroup().list(); } public static void logMessage(String s) { System.out.println(LocalTime.now()+" " +Thread.currentThread().getName()+": "+s); } static class myListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent e) { if ("progress".equals(e.getPropertyName())) { logMessage("propertyChange() "+e.getNewValue()+"%"); } } } }
Notes on the sample program:
If you compile and run this example with JDK 1.8, you should get output messages similar to these:
C:\>java SwingWorkerUsingProgress 23:02:46.481 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] 23:02:46.521 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] 23:02:46.531 SwingWorker-pool-1-thread-1: doInBackground() started 23:02:46.571 AWT-EventQueue-0: propertyChange() 4% 23:02:46.621 AWT-EventQueue-0: propertyChange() 9% 23:02:46.671 AWT-EventQueue-0: propertyChange() 14% 23:02:46.721 Thread dump: 23:02:46.721 AWT-EventQueue-0: propertyChange() 19% java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:46.771 AWT-EventQueue-0: propertyChange() 24% 23:02:46.821 AWT-EventQueue-0: propertyChange() 29% 23:02:46.871 AWT-EventQueue-0: propertyChange() 34% 23:02:46.921 AWT-EventQueue-0: propertyChange() 39% 23:02:46.921 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:46.971 AWT-EventQueue-0: propertyChange() 44% 23:02:47.021 AWT-EventQueue-0: propertyChange() 49% 23:02:47.071 AWT-EventQueue-0: propertyChange() 54% 23:02:47.121 AWT-EventQueue-0: propertyChange() 59% 23:02:47.121 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:47.171 AWT-EventQueue-0: propertyChange() 64% 23:02:47.221 AWT-EventQueue-0: propertyChange() 69% 23:02:47.271 AWT-EventQueue-0: propertyChange() 74% 23:02:47.321 AWT-EventQueue-0: propertyChange() 79% 23:02:47.331 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:47.371 AWT-EventQueue-0: propertyChange() 84% 23:02:47.421 AWT-EventQueue-0: propertyChange() 89% 23:02:47.471 AWT-EventQueue-0: propertyChange() 94% 23:02:47.521 AWT-EventQueue-0: propertyChange() 99% 23:02:47.531 SwingWorker-pool-1-thread-1: doInBackground() ended 23:02:47.531 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:47.571 AWT-EventQueue-0: propertyChange() 100% 23:02:47.731 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main] 23:02:47.931 Thread dump: java.lang.ThreadGroup[name=main,maxpri=10] Thread[main,5,main] Thread[SwingWorker-pool-1-thread-1,5,main] Thread[AWT-Shutdown,5,main] Thread[AWT-Windows,6,main] Thread[AWT-EventQueue-0,6,main]
Some interesting notes on the output:
The picture below gives you an idea on how the Launching thread, the Worker thread, and the Dispatch thread
worked together in this example where I am repeatedly updating "progress" property value inside the doInBackground() method,
and using a PropertyChangeListener class to catch it:
Last update: 2014.
Table of Contents
Introduction of Java Swing Package
Graphics Environment of the Local System
JRadioButton - Swing Radio Button Class
JTextField - Swing Text Field Class
Menu Bar, Menus, Menu Items and Listeners
Creating Internal Frames inside the Main Frame
Layout of Components in a Container
JEditorPane - The Editor Pane Class
►SwingWorker - The Background Task Worker
SwingWorker Example using done() Method
SwingWorker Example using publish() Method
►SwingWorker Example using "progress" Property