首页  >  文章  >  Java  >  在 Swing 中加载图像时如何避免 GUI 冻结?

在 Swing 中加载图像时如何避免 GUI 冻结?

Susan Sarandon
Susan Sarandon原创
2024-11-10 03:33:02405浏览

How to Avoid GUI Freezing While Loading Images in Swing?

使用 SwingWorker 显示图像

问题:加载图像时冻结 GUI

当图像从 Web 加载到面板时,GUI 可以冻结直到加载过程完成。这可能会让用户感到烦恼。

解决方案:使用 SwingWorker

为了避免 GUI 冻结,请考虑使用 javax.swing.SwingWorker。该类支持在保持 GUI 线程处于活动状态的同时后台加载图像。

实现

以下示例演示如何使用 SwingWorker 加载图像:

import java.awt.*;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public final class WorkerTest extends JFrame {

    private final JLabel label = new JLabel("Loading...");

    public WorkerTest() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.BOTTOM);
        this.add(label);
        this.pack();
        this.setLocationRelativeTo(null);
    }

    private void start() {
        new ImageWorker().execute();
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(() -> {
            WorkerTest wt = new WorkerTest();
            wt.setVisible(true);
            wt.start();
        });
    }

    class ImageWorker extends SwingWorker<Image, Void> {

        private static final String TEST
            = "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png";

        @Override
        protected Image doInBackground() throws IOException {
            Image image = ImageIO.read(new URL(TEST));
            return image.getScaledInstance(640, -1, Image.SCALE_SMOOTH);
        }

        @Override
        protected void done() {
            try {
                ImageIcon icon = new ImageIcon(get());
                label.setIcon(icon);
                label.setText("Done");
                WorkerTest.this.pack();
                WorkerTest.this.setLocationRelativeTo(null);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

在此例如:

  • ImageWorker 类扩展了 SwingWorker;处理图像的加载和调整大小。
  • 重写的 doInBackground() 方法从 URL 加载图像并将其缩放到所需的大小。
  • 重写的 did() 方法更新标签的图标图像加载完成后显示文本,并相应地调整框架的大小和位置。
  • 可以修改提供的代码中的 btn_TrackbusActionPerformed 方法,以在单击按钮时调用 start() 方法,启动图像加载

通过使用 SwingWorker,图像加载过程可以在后台运行,允许 GUI 在获取和显示图像时保持响应。

以上是在 Swing 中加载图像时如何避免 GUI 冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!

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