Maison > Java > javaDidacticiel > Comment charger des images de manière asynchrone dans Java Swing pour empêcher le gel de l'interface graphique ?

Comment charger des images de manière asynchrone dans Java Swing pour empêcher le gel de l'interface graphique ?

Barbara Streisand
Libérer: 2024-11-14 13:14:02
original
323 Les gens l'ont consulté

How to Load Images Asynchronously in Java Swing to Prevent GUI Freezing?

Chargement d'une image de manière asynchrone

Dans le code fourni, le processus de chargement d'image peut geler l'interface graphique, en particulier lorsque l'image est grande ou que la connexion réseau est lente. Pour éviter ce problème et garder l'interface graphique réactive, nous pouvons utiliser un fil d'arrière-plan pour charger l'image. Cette technique est appelée chargement d'image asynchrone.

Utilisation de SwingWorker pour le chargement asynchrone

La classe javax.swing.SwingWorker de Java fournit un moyen pratique d'effectuer des tâches en arrière-plan et de mettre à jour l'interface graphique une fois qu'ils sont terminés. Voici comment nous pouvons l'utiliser pour charger une image de manière asynchrone :

import javax.swing.SwingWorker;
import java.awt.image.BufferedImage;
import javax.swing.JLabel;

public class ImageLoader extends SwingWorker<BufferedImage, Void> {

    private final String imageUrl;
    private final JLabel label;

    public ImageLoader(String imageUrl, JLabel label) {
        this.imageUrl = imageUrl;
        this.label = label;
    }

    @Override
    protected BufferedImage doInBackground() throws Exception {
        // Load the image in the background
        BufferedImage image = ImageIO.read(new URL(imageUrl));
        return image;
    }

    @Override
    protected void done() {
        try {
            BufferedImage image = get();
            // Update the GUI with the loaded image in the EDT
            label.setIcon(new ImageIcon(image));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Copier après la connexion

Intégration à votre code

Pour intégrer cette solution à votre code :

  1. Dans la classe client_trackedbus, créez une instance d'ImageLoader et exécutez-la dans le constructeur :

    public client_trackedbus( ... ) {
        // ...
        ImageLoader imageLoader = new ImageLoader("http://www.huddletogether.com/projects/lightbox2/images/image-2.jpg", label);
        imageLoader.execute();
        // ...
    }
    Copier après la connexion
  2. Dans la méthode displayMap, supprimez le code de chargement de l'image et définissez simplement la visibilité de l'étiquette sur true :

    private void displayMap(...) {
        // ...
        label.setVisible(true);
        // ...
    }
    Copier après la connexion

En suivant ces étapes, le processus de chargement de l'image sera effectué de manière asynchrone, permettant à l'interface graphique de rester réactive pendant la récupération de l'image.

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