Recherche…


Syntaxe

  • classe publique abstraite SwingWorker <T, V>

  • T - le type de résultat renvoyé par le doInBackground de ce SwingWorker et les méthodes get.

  • V - le type utilisé pour effectuer des résultats intermédiaires par les méthodes de publication et de traitement de SwingWorker.

  • T doInBackground () - La fonction abstraite qui doit être remplacée. Le type de retour est T.

Fil de distribution principal et d'événement

Comme tout programme java, chaque programme de swing commence par une méthode principale. La méthode principale est initiée par le thread principal. Cependant, les composants Swing doivent être créés et mis à jour sur le thread de distribution des événements (ou short: EDT). Pour illustrer la dynamique entre le thread principal et l’EDT, jetez un coup d’œil à ce Hello World! Exemple.

Le thread principal est juste utilisé pour déléguer la création de la fenêtre à l'EDT. Si l'EDT n'est pas encore lancée, le premier appel à SwingUtilities.invokeLater configurera l'infrastructure nécessaire au traitement des composants Swing. En outre, l’EDT reste active en arrière-plan. Le thread principal va mourir directement après le lancement de la configuration EDT, mais l'EDT restera actif jusqu'à ce que l'utilisateur quitte le programme. Cela peut être réalisé en appuyant sur la case de JFrame instance JFrame visible. Cela va arrêter l'EDT et le processus du programme va complètement.

Recherchez les N premiers nombres pairs et affichez les résultats dans un JTextArea où les calculs sont effectués en arrière-plan.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {
    private final int numbersToFind;

    private final JTextArea textArea;

    PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
        this.numbersToFind = numbersToFind;
        this.textArea = textArea;
    }

    @Override
    public List<Integer> doInBackground() {
        final List<Integer> result = new ArrayList<>();
        boolean interrupted = false;
        for (int i = 0; !interrupted && (i < numbersToFind); i += 2) {
            interrupted = doIntenseComputing();
            result.add(i);
            publish(i); // sends data to process function
        }
        return result;
    }

    private boolean doIntenseComputing() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            return true;
        }
        return false;
    }

    @Override
    protected void process(List<Integer> chunks) {
        for (int number : chunks) {
            // the process method will be called on the EDT
            // thus UI elementes may be updated in here
            textArea.append(number + "\n");
        }
    }
}

public class SwingWorkerExample extends JFrame {
    private JTextArea textArea;

    public SwingWorkerExample() {
        super("Java SwingWorker Example");
        init();
    }

    private void init() {
        setSize(400, 400);
        setLayout(new GridLayout(1, 1));
        textArea = new JTextArea();
        add(textArea);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
    }

    public static void main(String args[]) throws Exception {

        SwingWorkerExample ui = new SwingWorkerExample();
        EventQueue.invokeLater(() -> {
            ui.setVisible(true);
        });

        int n = 100;
        PrimeNumbersTask task = new PrimeNumbersTask(ui.textArea, n);
        task.execute(); // run async worker which will do long running task on a
        // different thread
        System.out.println(task.get());
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow