Поиск…


Синтаксис

  • открытый абстрактный класс SwingWorker <T, V>

  • T - результат, возвращаемый этим DoInBackground SwingWorker и метод get.

  • V - тип, используемый для выполнения промежуточных результатов с помощью этих методов публикации и процессов SwingWorker.

  • T doInBackground () - абстрактная функция, которая должна быть переопределена. Возвратный тип - T.

Основная и отправка событий

Как и любая другая Java-программа, каждая программа качания начинается с основного метода. Основной метод инициируется основным потоком. Однако компоненты Swing должны быть созданы и обновлены в потоке отправки событий (или коротком: EDT). Чтобы проиллюстрировать динамику между основным потоком и EDT, взгляните на этот Hello World! пример.

Основной поток просто используется для делегирования создания окна в EDT. Если EDT еще не SwingUtilities.invokeLater , первый вызов SwingUtilities.invokeLater настроит необходимую инфраструктуру для обработки компонентов Swing. Кроме того, EDT остается активным в фоновом режиме. Основной поток будет умирать сразу после начала установки EDT, но EDT останется активным до тех пор, пока пользователь не выйдет из программы. Этого можно достичь, нажав кнопку закрытия на видимом экземпляре JFrame . Это остановит EDT, и процесс программы будет полностью завершен.

Найдите первые N четных чисел и покажите результаты в JTextArea, где вычисления выполняются в фоновом режиме.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow