Maison  >  Article  >  Java  >  Comment utiliser Swing Timer et SwingWorker pour une gestion efficace des tâches de l'interface graphique en Java ?

Comment utiliser Swing Timer et SwingWorker pour une gestion efficace des tâches de l'interface graphique en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 05:31:30474parcourir

How to Use Swing Timer and SwingWorker for Efficient GUI Task Management in Java?

Utilisation de Swing Timer et SwingWorker pour des tâches répétitives et de longue durée dans l'interface graphique

Dans une interface utilisateur graphique (GUI), maintenir le la réactivité de l’application est cruciale. L'exécution de tâches longues ou répétitives, telles que des appels réseau ou des calculs lourds, peut geler l'interface utilisateur si elle n'est pas gérée correctement.

Swing Timer pour les tâches répétitives

Pour les tâches qui doivent se répéter à intervalles réguliers (par exemple, mettre à jour une étiquette avec les données d'un serveur), Swing fournit la classe Timer. Un minuteur peut être configuré avec un délai et un ActionListener qui définit les actions à effectuer lorsque le minuteur se déclenche.

SwingWorker pour les tâches de longue durée

SwingWorker est un Swing composant qui étend SwingUtilities et est conçu pour les tâches qui prennent une période prolongée. Il vous permet d'effectuer la tâche dans un fil d'arrière-plan tout en gardant l'interface utilisateur réactive. Lorsque la tâche est terminée, SwingWorker informe le thread principal de mettre à jour l'interface utilisateur avec le résultat.

Exemple : mise à jour d'une étiquette avec les résultats du ping du serveur

Pour démontrer le utilisation combinée de Timer et SwingWorker, considérez l'extrait de code suivant :

<code class="java">import javax.swing.*;
import java.awt.event.*;
import java.net.Socket;

public class LabelUpdateExample {

    private static String hostnameOrIP = "stackoverflow.com";
    private static int delay = 5000;
    private static JLabel label = new JLabel("0000");

    public static void main(String[] args) {
        label.setFont(label.getFont().deriveFont(120f));

        ActionListener timerListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new PingWorker().execute();
            }
        };
        Timer timer = new Timer(delay, timerListener);

        timer.start();
        JOptionPane.showMessageDialog(
                null, label, hostnameOrIP, JOptionPane.INFORMATION_MESSAGE);
        timer.stop();
    }

    private static class PingWorker extends SwingWorker {

        private int time;

        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime();
            return new Integer(time);
        }

        @Override
        protected void done() {
            label.setText("" + time);
        }
    }

    private static int pingTime() {
        Socket socket = null;
        long start = System.currentTimeMillis();
        try {
            socket = new Socket(hostnameOrIP, 80);
        } catch (Exception weTried) {
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (Exception weTried) {}
            }
        }
        long end = System.currentTimeMillis();
        return (int) (end - start);
    }
}</code>

Ce code crée un JLabel qui affiche le temps de ping sur un hôte spécifié et le met à jour toutes les 5 secondes à l'aide d'une minuterie. L'opération ping est effectuée dans un thread d'arrière-plan utilisant SwingWorker pour éviter de geler l'interface utilisateur. Une fois le ping terminé, SwingWorker met à jour l'étiquette avec le résultat, garantissant ainsi que l'interface graphique reste réactive pendant la tâche de longue duré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!

Déclaration:
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