首页 > Java > java教程 > SwingWorker 如何提高 Java Swing 应用程序的响应能力?

SwingWorker 如何提高 Java Swing 应用程序的响应能力?

Patricia Arquette
发布: 2024-12-06 07:57:13
原创
909 人浏览过

How can SwingWorker Improve Responsiveness in Java Swing Applications?

在 Java 中实现 SwingWorker

在之前关于从另一个类重绘的问题中,提到了 SwingWorker 的概念。本文旨在详细阐述 SwingWorker 的使用,特别是在原始问题中提供的代码片段的上下文中。

理解 SwingWorker

SwingWorker 是一个实用程序类在 Java 中,它有助于在 Swing 应用程序中执行耗时的任务。它允许在单独的线程上执行这些任务,从而防止 GUI 锁定。

实现 SwingWorker

使用 SwingWorker,这是一个扩展它的新类应该被创建。在此类中,应实现以下内容:

  1. doInBackground():此方法包含长时间运行的任务。它在单独的线程上运行。
  2. done():当 doInBackground() 方法完成时调用此方法。用于处理任务结果并更新GUI。

例如:

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();
        }
    }
}
登录后复制

调用SwingWorker

要调用 SwingWorker,请调用其execute() 方法。通常,这可以通过事件处理程序(例如 ActionListener)来完成:

JButton b = new JButton("Answer!");
b.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        new AnswerWorker().execute();
    }
});
登录后复制

示例:

以下代码演示了如何在简单的示例中使用 SwingWorker GUI 应用程序:

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();
            }
        }
    }
}
登录后复制

通过以这种方式使用 SwingWorker,GUI 保持响应,而耗时的任务是后台的eseguito。

以上是SwingWorker 如何提高 Java Swing 应用程序的响应能力?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板