Maison > Java > javaDidacticiel > Comment éviter le gel de l'interface graphique lors du chargement d'images dans Swing ?

Comment éviter le gel de l'interface graphique lors du chargement d'images dans Swing ?

Susan Sarandon
Libérer: 2024-11-10 03:33:02
original
440 Les gens l'ont consulté

How to Avoid GUI Freezing While Loading Images in Swing?

Afficher les images à l'aide de SwingWorker

Problème : geler l'interface graphique lors du chargement des images

Lorsqu'une image est chargée depuis le Web vers un panneau, l'interface graphique peut congeler jusqu'à ce que le processus de chargement soit terminé. Cela peut être ennuyeux pour les utilisateurs.

Solution : Utiliser SwingWorker

Pour éviter le gel de l'interface graphique, pensez à utiliser javax.swing.SwingWorker. Cette classe permet le chargement d'images en arrière-plan tout en gardant le thread GUI actif.

Implémentation

L'exemple suivant montre comment utiliser SwingWorker pour charger des images :

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();
            }
        }
    }
}
Copier après la connexion

Dans ce exemple :

  • La classe ImageWorker étend SwingWorker pour gérer le chargement et le redimensionnement de l'image.
  • La méthode doInBackground() substituée charge l'image à partir d'une URL et la redimensionne à la taille souhaitée.
  • La méthode substituée done() met à jour l'icône de l'étiquette et du texte lorsque le chargement de l'image est terminé, et redimensionne et repositionne le cadre en conséquence.
  • La méthode btn_TrackbusActionPerformed dans le code fourni peut être modifiée pour appeler la méthode start() lorsque le bouton est cliqué, lançant ainsi le chargement de l'image. processus en arrière-plan.

En utilisant SwingWorker, le processus de chargement de l'image peut s'exécuter en arrière-plan, permettant à l'interface graphique de rester réactive pendant que l'image est récupérée et affichée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal