Maison > Java > javaDidacticiel > Comment SwingWorker peut-il améliorer la réactivité des applications Java Swing ?

Comment SwingWorker peut-il améliorer la réactivité des applications Java Swing ?

Patricia Arquette
Libérer: 2024-12-06 07:57:13
original
889 Les gens l'ont consulté

How can SwingWorker Improve Responsiveness in Java Swing Applications?

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 :

  1. doInBackground() : Cette méthode contient la tâche de longue durée. Il s'exécute sur un thread séparé.
  2. done() : Cette méthode est appelée lorsque la méthode doInBackground() se termine. Il est utilisé pour gérer les résultats de la tâche et mettre à jour l'interface graphique.

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();
        }
    }
}
Copier après la connexion

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();
    }
});
Copier après la connexion

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();
            }
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal