Implémentation de SwingWorker en Java
Dans une question précédente concernant la repeinture à partir d'une autre classe, le concept de SwingWorker a été mentionné. Cet article vise à développer l'utilisation de SwingWorker, en particulier dans le contexte de l'extrait de code fourni dans la question d'origine.
Comprendre SwingWorker
SwingWorker est une classe utilitaire en Java qui facilite l'exécution de tâches chronophages dans les applications Swing. Il permet d'effectuer ces tâches sur un thread séparé, empêchant ainsi le blocage de l'interface graphique.
Implémentation de SwingWorker
Pour utiliser SwingWorker, une nouvelle classe qui l'étend devrait être créé. Dans cette classe, les éléments suivants doivent être implémentés :
Par exemple :
class AnswerWorker extends SwingWorker<Integer, Integer> { @Override protected Integer doInBackground() throws Exception { // Perform a time-consuming task here. Thread.sleep(1000); return 42; } @Override protected void done() { try { // Display the result of the task in a message box. JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } }
Invoquer SwingWorker
Pour invoquer SwingWorker, appelez sa méthodeexecute(). Généralement, cela peut être fait à partir d'un gestionnaire d'événements, tel qu'un ActionListener :
JButton b = new JButton("Answer!"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } });
Exemple :
Le code suivant démontre l'utilisation de SwingWorker de manière simple. Application GUI :
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingWorker; public class SwingWorkerExample { public static void main(String[] args) { makeGUI(); } private static void makeGUI() { final JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setLayout(new FlowLayout()); // Create and invoke SwingWorker. JButton answerButton = new JButton("Answer!"); answerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AnswerWorker().execute(); } }); f.getContentPane().add(answerButton); f.pack(); f.setVisible(true); } private static class AnswerWorker extends SwingWorker<Integer, Integer> { @Override protected Integer doInBackground() throws Exception { // Perform a time-consuming task. Thread.sleep(1000); return 42; } @Override protected void done() { try { // Display the result of the task in a message box. JOptionPane.showMessageDialog(f, get()); } catch (Exception e) { e.printStackTrace(); } } } }
En utilisant SwingWorker de cette manière, l'interface graphique reste réactive pendant que la tâche fastidieuse est eseguito 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!