Suche…


Syntax

  • öffentliche abstrakte Klasse SwingWorker <T, V>

  • T - Der von diesem SwingWorker-Typ doInBackground und get-Methoden zurückgegebene Ergebnistyp.

  • V - der Typ, der für die Ausführung von Zwischenergebnissen der Veröffentlichungs- und Verarbeitungsverfahren dieses SwingWorker verwendet wird.

  • T doInBackground () - Die abstrakte Funktion, die überschrieben werden muss. Rückgabetyp ist T.

Haupt- und Ereignisausgabe-Thread

Wie jedes andere Java-Programm beginnt jedes Swing-Programm mit einer Hauptmethode. Die Hauptmethode wird vom Hauptthread initiiert. Swing-Komponenten müssen jedoch im Event-Dispatch-Thread (oder kurz: EDT) erstellt und aktualisiert werden. Um die Dynamik zwischen dem Hauptthread und dem EDT zu veranschaulichen, werfen Sie einen Blick auf diese Hello World! Beispiel.

Der Haupt-Thread wird nur verwendet, um die Erstellung des Fensters an den EDT zu delegieren. Wenn der EDT noch nicht initiiert ist, SwingUtilities.invokeLater der erste Aufruf von SwingUtilities.invokeLater die erforderliche Infrastruktur für die Verarbeitung von Swing-Komponenten ein. Darüber hinaus bleibt der EDT im Hintergrund aktiv. Der Haupt-Thread wird direkt nach dem Einrichten des EDT-Setups sterben, der EDT bleibt jedoch aktiv, bis der Benutzer das Programm beendet. Dies kann erreicht werden, indem Sie das JFrame in der sichtbaren JFrame Instanz JFrame . Dadurch wird der EDT heruntergefahren und der Programmprozess wird vollständig ablaufen.

Ermitteln Sie die ersten N geraden Zahlen und zeigen Sie die Ergebnisse in einer JTextArea an, in der Berechnungen im Hintergrund ausgeführt werden.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow