Swing で画像をロードする際の GUI のフリーズを回避するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-10 03:33:02
オリジナル
410 人が閲覧しました

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 から画像を読み込み、希望のサイズに拡大縮小します。
  • オーバーライドされた Done() メソッドは、ラベルのアイコンを更新します画像の読み込みが完了するとテキストとテキストが表示され、それに応じてフレームのサイズと位置が変更されます。
  • 提供されたコードの btn_TrackbusActionPerformed メソッドを変更して、ボタンがクリックされたときに start() メソッドを呼び出し、バックグラウンドで画像読み込みプロセスを開始できます。

SwingWorker を使用すると、画像読み込みプロセスを実行できます。バックグラウンドで動作するため、画像がフェッチされて表示されている間も GUI の応答性を維持できます。

以上がSwing で画像をロードする際の GUI のフリーズを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート