Buscar..


Sintaxis

  • Clase abstracta pública SwingWorker <T, V>

  • T: el tipo de resultado que devuelve este método SwingWorker's doInBackground y get.

  • V: el tipo utilizado para llevar a cabo resultados intermedios mediante los métodos de publicación y procesamiento de este SwingWorker.

  • T doInBackground (): la función abstracta que debe anularse. El tipo de devolución es T.

Tema principal y evento de despacho

Como cualquier otro programa de Java, cada programa de swing comienza con un método principal. El método principal es iniciado por el hilo principal. Sin embargo, los componentes de Swing deben crearse y actualizarse en el hilo de despacho de eventos (o en breve: EDT). Para ilustrar la dinámica entre el hilo principal y el EDT, eche un vistazo a este Hello World! ejemplo.

El hilo principal solo se utiliza para delegar la creación de la ventana a la EDT. Si la EDT aún no se ha iniciado, la primera llamada a SwingUtilities.invokeLater configurará la infraestructura necesaria para procesar los componentes Swing. Además, la EDT permanece activa en el fondo. El hilo principal morirá directamente después de iniciar la configuración de la EDT, pero la EDT permanecerá activa hasta que el usuario salga del programa. Esto se puede lograr presionando el cuadro de cierre en la instancia de JFrame visible. Esto cerrará el EDT y el proceso del programa se realizará por completo.

Encuentre los primeros N números pares y muestre los resultados en un JTextArea donde los cálculos se realizan en segundo plano.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow