Implementing SwingWorker in Java
In a previous question regarding repainting from another class, the concept of SwingWorker was mentioned. This article aims to elaborate on the use of SwingWorker, particularly in the context of the code snippet provided in the original question.
Understanding SwingWorker
SwingWorker is a utility class in Java that facilitates the execution of time-consuming tasks in Swing applications. It allows for these tasks to be performed on a separate thread, preventing the GUI from locking up.
Implementing SwingWorker
To use SwingWorker, a new class that extends it should be created. In this class, the following should be implemented:
For example:
class AnswerWorker extends SwingWorker<Integer, Integer> { @Override protected Integer doInBackground() throws Exception { // Perform a time-consuming task here. Thread.sleep(1000); return 42; } @Override protected void done() { try { // Display the result of the task in a message box. JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } }
Invoking SwingWorker
To invoke the SwingWorker, call its execute() method. Typically, this can be done from an event handler, such as an ActionListener:
JButton b = new JButton("Answer!"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } });
Example:
The following code demonstrates the use of SwingWorker in a simple GUI application:
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingWorker; public class SwingWorkerExample { public static void main(String[] args) { makeGUI(); } private static void makeGUI() { final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new FlowLayout()); // Create and invoke SwingWorker. JButton answerButton = new JButton("Answer!"); answerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } }); f.getContentPane().add(answerButton); f.pack(); f.setVisible(true); } private static class AnswerWorker extends SwingWorker<Integer, Integer> { @Override protected Integer doInBackground() throws Exception { // Perform a time-consuming task. Thread.sleep(1000); return 42; } @Override protected void done() { try { // Display the result of the task in a message box. JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } } }
By using SwingWorker in this manner, the GUI remains responsive while the time-consuming task is eseguito in the background.
The above is the detailed content of How can SwingWorker Improve Responsiveness in Java Swing Applications?. For more information, please follow other related articles on the PHP Chinese website!