Szukaj…


Składnia

  • publiczna klasa abstrakcyjna SwingWorker <T, V>

  • T - typ wyniku zwracany przez doInBackground tego SwingWorkera i metody get.

  • V - typ używany do przeprowadzania wyników pośrednich za pomocą metod publikowania i przetwarzania tego SwingWorker.

  • T doInBackground () - Funkcja abstrakcyjna, którą należy przesłonić. Typ powrotu to T.

Wątek wysyłki głównej i zdarzenia

Jak każdy inny program Java, każdy program swing zaczyna się od głównej metody. Główna metoda jest inicjowana przez główny wątek. Jednak komponenty Swing muszą zostać utworzone i zaktualizowane w wątku wysyłki zdarzeń (lub w skrócie: EDT). Aby zilustrować dynamikę między głównym wątkiem a EDT, spójrz na ten Hello World! przykład.

Główny wątek służy właśnie do delegowania tworzenia okna do EDT. Jeśli EDT nie zostanie jeszcze zainicjowany, pierwsze wywołanie SwingUtilities.invokeLater skonfiguruje niezbędną infrastrukturę do przetwarzania komponentów Swing. Ponadto EDT pozostaje aktywny w tle. Główny wątek umrze bezpośrednio po zainicjowaniu konfiguracji EDT, ale EDT pozostanie aktywny, dopóki użytkownik nie wyjdzie z programu. Można to osiągnąć, naciskając pole zamykania widocznej instancji JFrame . Spowoduje to zamknięcie EDT i proces programu całkowicie się zakończy.

Znajdź pierwsze N liczb parzystych i wyświetl wyniki w JTextArea, gdzie obliczenia są wykonywane w tle.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow