Java 中的 SwingWorker
要在 Swing 中执行长时间运行的任务而不阻塞事件调度线程 (EDT),请考虑使用 SwingWorker。本文旨在解决与上一个问题“从 Java 中的另一个类调用重绘”相关的特定用例。
了解 SwingWorker
SwingWorker 允许您运行异步任务,保持 GUI 响应。它处理后台任务和 EDT 之间的数据交换。
在 Java 中实现 SwingWorker
受前面的启发,考虑以下代码片段问题:
// **illustrates previous example** import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.SwingWorker; public class SwingWorkerExample { private static void main(String[] args) { // Initialize GUI JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout()); // Create and add a button to trigger the SwingWorker JButton button = new JButton("Start Async Task"); panel.add(button); f.add(panel); f.pack(); f.setVisible(true); // SwingWorker to perform the task SwingWorker<Integer, Void> worker = new SwingWorker<Integer, Void>() { // executed on a background thread: @Override protected Integer doInBackground() throws Exception { // simulate a heavy task: Thread.sleep(3000); // replace with actual code... return 42; // return an integer result... } // executed on the EDT after doInBackground completes: @Override protected void done() { try { // get the result of the SwingWorker: int result = get(); } catch (Exception ex) { ex.printStackTrace(); } } }; // ActionListener for the button: button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // start the SwingWorker when the button is clicked: worker.execute(); } }); } }
解释:
以上是在 Java 中执行长时间运行的任务时,SwingWorker 如何防止阻塞事件分发线程?的详细内容。更多信息请关注PHP中文网其他相关文章!