Sök…


Syntax

  • public abstract class SwingWorker <T, V>

  • T - resultattypen som returneras av denna SwingWorkers doInBackground och få metoder.

  • V - den typ som används för att utföra mellanresultat med denna SwingWorkers publicerings- och processmetoder.

  • T doInBackground () - Den abstrakta funktionen som måste åsidosättas. Återgå typ är T.

Huvud och händelseförsändningstråd

Liksom alla andra java-program börjar varje swing-program med en huvudmetod. Huvudmetoden initieras av huvudtråden. Swing-komponenter måste dock skapas och uppdateras på händelseförsändningstråden (eller kort: EDT). För att illustrera dynamiken mellan huvudtråden och EDT titta på denna Hello World! exempel.

Huvudtråden används bara för att delegera skapandet av fönstret till EDT. Om EDT inte initieras ännu, kommer det första samtalet till SwingUtilities.invokeLater att installera den nödvändiga infrastrukturen för att bearbeta Swing-komponenter. Dessutom förblir EDT aktiv i bakgrunden. Huvudtråden kommer att dö direkt efter att EDT-installationen har startats, men EDT kommer att förbli aktiv tills användaren lämnar programmet. Detta kan uppnås genom att slå stängningsrutan på den synliga JFrame instansen. Detta kommer att stänga av EDT och programmets process kommer att gå helt.

Hitta de första N jämna siffrorna och visa resultaten i en JTextArea där beräkningar görs i bakgrunden.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow