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!