Maison >Java >javaDidacticiel >Comment utiliser SwingWorker et Timer pour mettre à jour JLabel avec les résultats de tâches de longue durée en 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!