ホームページ  >  記事  >  Java  >  SwingWorker を使用して GUI をフリーズさせずに画像を表示する方法

SwingWorker を使用して GUI をフリーズさせずに画像を表示する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 12:09:021019ブラウズ

How to Display an Image Without Freezing the GUI Using SwingWorker?

GUI をフリーズさせずに画像を表示する方法

問題

ボタンをクリックすると、Web から画像が読み込まれて表示されます別の JFrame 内のパネル。ただし、これにより、画像の読み込みプロセス中にアプリケーション ウィンドウが一時的にフリーズします。

原因

この問題は、ボタンのクエリがイベント ディスパッチ スレッド (EDT) で実行されるために発生します。このスレッドはすべての GUI 更新の処理を担当するため、このスレッドがブロックされると、アプリケーションは応答しなくなります。

解決策: SwingWorker を使用する

フリーズを回避するには、画像をバックグラウンドでロードする必要があります。 GUI は応答性を維持します。これは、javax.swing.SwingWorker クラスを使用して実現できます。

SwingWorker は、EDT をブロックせずにバックグラウンドでタスクを実行できるスレッドセーフ クラスです。実行するタスクを設定し、別のスレッドで実行するためのメソッドが提供されます。

実装

ここでは、SwingWorker を使用して GUI をフリーズせずに画像を表示する方法の例を示します。

import java.util.concurrent.ExecutionException;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class ImageDisplaySwingWorker extends JFrame {

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

    public ImageDisplaySwingWorker() {
        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(new Runnable() {

            @Override
            public void run() {
                ImageDisplaySwingWorker imageDisplaySwingWorker = new ImageDisplaySwingWorker();
                imageDisplaySwingWorker.setVisible(true);
                imageDisplaySwingWorker.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");
                ImageDisplaySwingWorker.this.pack();
                ImageDisplaySwingWorker.this.setLocationRelativeTo(null);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

このコードでは:

  1. ラベルは画像の表示に使用されます。
  2. start() メソッドは、画像の読み込みプロセスを開始するために呼び出されます。
  3. ImageWorker クラスは SwingWorker を拡張し、画像を別のスレッド。
  4. 画像の読み込みが完了すると、done() メソッドが呼び出されます。画像をラベルのアイコンとして設定し、GUI を更新します。

以上がSwingWorker を使用して GUI をフリーズさせずに画像を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。