Ricerca…


Sintassi

  • classe astratta pubblica SwingWorker <T, V>

  • T - il tipo di risultato restituito da doInBackground di questo SwingWorker e metodi.

  • V - il tipo utilizzato per eseguire risultati intermedi con i metodi di pubblicazione e di processo di SwingWorker.

  • T doInBackground () - La funzione astratta che deve essere ignorata. Il tipo di ritorno è T.

Thread di invio principale ed evento

Come ogni altro programma java, ogni programma swing inizia con un metodo principale. Il metodo principale è avviato dal thread principale. Tuttavia, i componenti di Swing devono essere creati e aggiornati sul thread di invio eventi (o breve: EDT). Per illustrare la dinamica tra il thread principale e l'EDT dai un'occhiata a questo Hello World! esempio.

Il thread principale è appena usato per delegare la creazione della finestra all'EDT. Se l'EDT non è ancora stato avviato, la prima chiamata a SwingUtilities.invokeLater l'infrastruttura necessaria per l'elaborazione dei componenti di Swing. Inoltre, l'EDT rimane attivo in background. Il thread principale sta per morire direttamente dopo l'avvio della configurazione di EDT, ma l'EDT rimarrà attivo fino a quando l'utente non uscirà dal programma. Questo può essere ottenuto premendo il riquadro di chiusura JFrame visibile. Ciò interromperà l'EDT e il processo del programma sarà interamente.

Trova i primi N numeri pari e visualizza i risultati in un JTextArea dove i calcoli vengono eseguiti in background.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow