Maison >Java >javaDidacticiel >Comment SwingWorker peut-il empêcher le gel de l'interface graphique en Java ?

Comment SwingWorker peut-il empêcher le gel de l'interface graphique en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 15:38:14524parcourir

How Can SwingWorker Prevent GUI Freezes in Java?

Utilisation de SwingWorker en Java

Introduction

Tâches de longue durée exécutées lors de la répartition d'événements Thread peut geler l’interface graphique. Ce problème peut être résolu en utilisant SwingWorker, qui prend en charge l'exécution de telles tâches sur un thread séparé.

Comment utiliser SwingWorker

  1. Définir une sous-classe de SwingWorker : La sous-classe doit définir une méthode doInBackground, où la tâche de longue durée est exécutée, et une méthode done, qui sera appelé lorsque la tâche est terminée.
  2. Exécuter le SwingWorker : La méthode d'exécution est utilisée pour démarrer le SwingWorker sur un thread séparé. Vous pouvez lier cela à un événement, comme un clic sur un bouton.
  3. Gérer le résultat : La méthode get peut être utilisée pour récupérer le résultat de la tâche une fois celle-ci terminée. Cela peut être fait dans la méthode done ou dans le gestionnaire d'événements qui a démarré le SwingWorker.

Exemple

Dans cet exemple, un SwingWorker est utilisé pour effectuer une tâche fastidieuse et afficher une boîte de message avec le résultat une seconde plus tard :

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SwingWorkerExample {

    private static void makeGUI() {
        final JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new FlowLayout());

        class AnswerWorker extends SwingWorker<Integer, Integer> {
            protected Integer doInBackground() throws Exception {
                Thread.sleep(1000);
                return 42;
            }

            protected void done() {
                JOptionPane.showMessageDialog(f, get());
            }
        }

        JButton b = new JButton("Answer!");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new AnswerWorker().execute();
            }
        });

        f.getContentPane().add(b);
        f.getContentPane().add(new JButton("Nothing"));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SwingWorkerExample::makeGUI);
    }
}

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