The first thing to consider is the SwingWorkder object inside Swing, but it is difficult to find ready-made examples on the Internet. I mainly referred to the information on the Internet and compiled one myself.
Note: The SwingWorkder object can only be executed once and cannot be executed repeatedly! For example, if you click Start, once it ends, you cannot start it again.
Copy the code code as follows:
import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.SwingWorker;
public class SwingWorkerSample {
public static void main(String[] args) {
// Appearance definition
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception ex) {
}
// form
JFrame f = new JFrame("SwingWorker Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Representation area
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp);
// Bottom progress bar
final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar);
// start button
JButton b = new JButton("Start");
f.add(BorderLayout.NORTH, b);
// end button
JButton b2 = new JButton("End");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// SwingWorker class
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** Execute operation*/
@Override
protected Integer doInBackground() throws Exception {
int sum = 0;
if (!this.isCancelled()) {
for (int i = 1; i <= 10; ++i) {
sum += i;
publish(new int[] { i, sum });//Call to represent intermediate results
setProgress(i * 10); // progress bar
Thread.sleep(1000);
}
}
return sum;
}
/** Represents intermediate results*/
@Override
protected void process(List<int[]> chunks) {
StringBuilder sb = new StringBuilder();
for (int[] values : chunks) {
sb.append(String.format("Accumulated %d is equal to %d%n", values[0], values[1]));
}
taOutput.append(sb.toString());
}
/** Processing completed*/
@Override
protected void done() {
if (this != null && !this.isDone()) {
try {
int result = get();
taOutput.append("Finished. Total" + result + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
};
// progress bar representation
sw.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Start button event
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sw.execute();//Asynchronously call SwingWorkder
}
});
// end button
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
//Cancel
sw.cancel(true);
}
JOptionPane.showMessageDialog(null, "End!");
}
});
// form representation
f.pack();
f.setVisible(true);
}
}