Maison  >  Article  >  Java  >  Comment utiliser SwingWorker et Timer pour mettre à jour JLabel avec les résultats de tâches de longue durée en Java ?

Comment utiliser SwingWorker et Timer pour mettre à jour JLabel avec les résultats de tâches de longue durée en Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-23 23:24:30234parcourir

How to Use SwingWorker and Timer to Update JLabel with Results of Long Running Tasks in Java?

Utiliser SwingWorker pour mettre à jour JLabel à plusieurs reprises avec les résultats d'une tâche de longue durée

Cette question répond à la nécessité de mettre à jour périodiquement un JLabel avec les résultats d'un tâche de longue haleine. Pour y parvenir en utilisant Java, il faut utiliser une combinaison de Swing Timer et SwingWorker.

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

Un Swing Timer offre un moyen pratique de planifier des tâches récurrentes. tâches dans une interface graphique. Dans ce cas, nous utiliserons le Timer pour exécuter la tâche de longue durée à intervalles réguliers.

SwingWorker pour les tâches de longue durée

SwingWorker est une sous-classe de SwingUtilities qui permet d'effectuer des tâches dans un thread séparé, en gardant l'interface graphique réactive. Ici, SwingWorker exécutera la tâche de longue durée consistant à envoyer une requête ping à un serveur et à mettre à jour le JLabel avec le résultat.

Exemple d'implémentation

Le code suivant montre comment implémenter ceci approche :

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

public class PingLabelUpdater {

    public static void main(String[] args) {
        final JLabel label = new JLabel("0000");
        ActionListener timerListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new PingWorker().execute();
            }
        };
        Timer timer = new Timer(1000, timerListener);

        label.setFont(label.getFont().deriveFont(120f));
        JOptionPane.showMessageDialog(null, label, "stackoverflow.com", JOptionPane.INFORMATION_MESSAGE);
        timer.stop();
    }

    static class PingWorker extends SwingWorker {
        int time;
        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime("stackoverflow.com");
            return new Integer(time);
        }
        @Override
        protected void done() {
            label.setText("" + time);
        }
    }

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

Dans cet exemple, la méthode pingTime établit une connexion au serveur spécifié (stackoverflow.com) et mesure le temps que cela prend. La méthode doInBackground de SwingWorker effectue le ping et sa méthode done met à jour l'étiquette avec la durée du ping. Le Timer est configuré pour exécuter SwingWorker à un intervalle de 1 000 millisecondes (1 seconde).

En combinant Swing Timer et SwingWorker, nous mettons à jour efficacement le JLabel avec des temps de ping sans bloquer le thread de l'interface graphique, garantissant ainsi un utilisateur réactif. interface pendant que la tâche s'exécute en arrière-plan.

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