首页 >Java >java教程 >SwingWorker 如何防止 Java 中的 GUI 冻结?

SwingWorker 如何防止 Java 中的 GUI 冻结?

Susan Sarandon
Susan Sarandon原创
2024-12-22 15:38:14502浏览

How Can SwingWorker Prevent GUI Freezes in Java?

在 Java 中使用 SwingWorker

简介

在事件调度上执行的长时间运行任务线程可以冻结 GUI。这个问题可以通过使用 SwingWorker 来解决,它支持在单独的线程上执行此类任务。

如何使用 SwingWorker

  1. 定义SwingWorker 的子类:子类应该定义一个 doInBackground 方法,其中长时间运行的任务是
  2. 执行 SwingWorker:execute 方法用于在单独的线程上启动 SwingWorker。您可以将其链接到一个事件,例如单击按钮。
  3. 处理结果:get 方法可用于在任务完成后检索结果。这可以在 done 方法中或在启动 SwingWorker 的事件处理程序中完成。

示例

在此示例中,SwingWorker 用于执行一项耗时的任务,并在一秒后显示包含结果的消息框:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SwingWorkerExample {

    private static void makeGUI() {
        final JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new FlowLayout());

        class AnswerWorker extends SwingWorker<Integer, Integer> {
            protected Integer doInBackground() throws Exception {
                Thread.sleep(1000);
                return 42;
            }

            protected void done() {
                JOptionPane.showMessageDialog(f, get());
            }
        }

        JButton b = new JButton("Answer!");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new AnswerWorker().execute();
            }
        });

        f.getContentPane().add(b);
        f.getContentPane().add(new JButton("Nothing"));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SwingWorkerExample::makeGUI);
    }
}

以上是SwingWorker 如何防止 Java 中的 GUI 冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn