Zoeken…


Syntaxis

  • openbare abstracte klasse SwingWorker <T, V>

  • T - het resultaattype geretourneerd door doInBackground van deze SwingWorker en krijg methoden.

  • V - het type dat wordt gebruikt voor het uitvoeren van tussentijdse resultaten door de publicatie- en verwerkingsmethoden van deze SwingWorker.

  • T doInBackground () - De abstracte functie die moet worden genegeerd. Het retourtype is T.

Hoofd- en gebeurtenisverzendingsdraad

Net als elk ander Java-programma begint elk swingprogramma met een hoofdmethode. De hoofdmethode wordt geïnitieerd door de hoofdthread. Swing-componenten moeten echter worden gemaakt en bijgewerkt in de gebeurtenisverzendingsdraad (of kort: EDT). Bekijk deze Hallo wereld om de dynamiek tussen de hoofdthread en de EDT te illustreren ! voorbeeld.

De hoofdthread wordt zojuist gebruikt om het maken van het venster aan de EDT te delegeren. Als de EDT nog niet is geïnitieerd, zal de eerste aanroep van SwingUtilities.invokeLater de nodige infrastructuur opzetten voor de verwerking van Swing-componenten. Bovendien blijft de EDT op de achtergrond actief. De hoofdthread gaat dood direct nadat de EDT-installatie is gestart, maar de EDT blijft actief totdat de gebruiker het programma verlaat. Dit kan worden bereikt door het JFrame op de zichtbare JFrame instantie aan te raken. Dit zal de EDT afsluiten en het proces van het programma zal volledig verlopen.

Zoek de eerste N even nummers en geef de resultaten weer in een JTextArea waar berekeningen worden uitgevoerd op de achtergrond.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow