首頁 > Java > java教程 > 在 Swing 中載入圖像時如何避免 GUI 凍結?

在 Swing 中載入圖像時如何避免 GUI 凍結?

Susan Sarandon
發布: 2024-11-10 03:33:02
原創
435 人瀏覽過

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 Image, Void>;處理圖片的載入和調整大小。
  • 重寫的 doInBackground() 方法從 URL 載入圖片並將其縮放到所需的大小。
  • 重寫的 did() 方法更新標籤的圖標圖像加載完成後顯示文本,並相應地調整框架大小和位置。
  • 提供的程式碼中的 btn_TrackbusActionPerformed 方法可以修改為按一下按鈕時呼叫 start() 方法,在背景啟動映像載入過程。

透過使用 SwingWorker,可以運行圖像載入過程在後台,允許 GUI 在獲取和顯示圖像時保持響應。

以上是在 Swing 中載入圖像時如何避免 GUI 凍結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板