Maison > Java > javaDidacticiel > le corps du texte

Pourquoi Thread.sleep() gèle-t-il mon interface utilisateur Swing ?

Linda Hamilton
Libérer: 2024-11-02 14:44:03
original
374 Les gens l'ont consulté

Why Does Thread.sleep() Freeze My Swing UI?

Impact de Thread.sleep() de Java sur l'interface utilisateur Swing

En Java, utilisation de Thread.sleep() dans une application basée sur Swing peut avoir pour conséquence involontaire de suspendre l'ensemble de l'interface utilisateur, la rendant insensible.

Description du problème :

Considérez l'extrait de code suivant :

<code class="java">// Code to create a simple Swing-based application
if (option == JFileChooser.APPROVE_OPTION) {
    selectedDirectory = chooser.getSelectedFiles();
    try {
        while (true) {
            runCheck(selectedDirectory);
            Thread.sleep(1000 * 5);//1000 is 1 second
        }
    } catch (InterruptedException e1) {
        Thread.currentThread().interrupt();
        e1.printStackTrace();
    }   
} </code>
Copier après la connexion

Cette application utilise Thread.sleep() pour faire une pause de 5 secondes avant d'effectuer une vérification. Cependant, pendant cette période de veille, l'interface utilisateur ne répond plus et est grisée.

Raison de l'inactivité de l'interface utilisateur :

Thread.sleep() met en pause le fil qui l'appelle , dans ce cas, le fil de répartition d'événement (EDT). L'EDT est responsable de la gestion de tous les événements GUI et du rendu de l'interface utilisateur. Par conséquent, lorsque l'EDT se met en veille, l'interface utilisateur cesse de répondre aux entrées et met à jour son affichage.

Approche alternative :

Pour éviter de geler l'interface utilisateur, une approche plus la solution appropriée consiste à utiliser un javax.swing.Timer. Un minuteur peut planifier l'exécution de tâches hors de l'EDT à des intervalles spécifiés :

<code class="java">Timer t = new Timer(1000 * 5, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do your recurring task
    }
});</code>
Copier après la connexion

Dans ce cas, la tâche d'exécution de la vérification est programmée pour s'exécuter toutes les 5 secondes hors de l'EDT, permettant à l'interface utilisateur de rester réactif pendant que le contrôle est en cours.

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