Первое, что нужно рассмотреть — это объект SwingWorkder внутри Swing, но в Интернете сложно найти готовые примеры. Я в основном ссылался на информацию в Интернете и компилировал один.
Примечание. Объект SwingWorkder может быть выполнен только один раз и не может выполняться повторно! Например, если вы нажмете «Пуск», то после его завершения вы не сможете запустить его снова.
Скопируйте код кода следующим образом:
импортировать java.awt.BorderLayout;
импортировать java.awt.event.*;
импортировать java.beans.PropertyChangeEvent;
импортировать java.beans.PropertyChangeListener;
импортировать java.util.List;
импортировать java.util.concurrent.ExecutionException;
импортировать javax.swing.*;
импортировать javax.swing.SwingWorker;
общественный класс SwingWorkerSample {
public static void main(String[] args) {
// Определение внешнего вида
пытаться {
UI-менеджер
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (исключение ex) {
}
// форма
JFrame f = новый JFrame («Образец SwingWorker»);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Область представления
окончательная JTextArea taOutput = новая JTextArea(15, 30);
JScrollPane sp = новый JScrollPane (taOutput);
f.add(сп);
// Нижний индикатор выполнения
окончательный JProgressBar ProgressBar = новый JProgressBar ();
f.add(BorderLayout.SOUTH, ProgressBar);
// кнопка запуска
JButton b = новая JButton («Начать»);
f.add(BorderLayout.NORTH, b);
// кнопка завершения
JButton b2 = новая JButton («Конец»);
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// класс SwingWorker
окончательный SwingWorker<Integer, int[]> sw = новый SwingWorker<Integer, int[]>() {
/** Выполнить операцию*/
@Override
protected Integer doInBackground() выдает исключение {
целая сумма = 0;
если (!this.isCancelled()) {
для (int я = 1; я <= 10; ++i) {
сумма += я;
public(new int[] { i, sum });//Вызов для представления промежуточных результатов
setProgress(i * 10 // индикатор выполнения);
Thread.sleep(1000);
}
}
сумма возврата;
}
/** Представляет промежуточные результаты*/
@Override
защищенный недействительный процесс (List<int[]> chunks) {
StringBuilder sb = новый StringBuilder();
for (int[] значения: куски) {
sb.append(String.format("Накопленный %d равен %d%n", значения[0], значения[1]));
}
taOutput.append(sb.toString());
}
/** Обработка завершена*/
@Override
защищенная пустота сделано() {
if (this != null && !this.isDone()) {
пытаться {
int результат = получить();
taOutput.append("Завершено. Итого" + результат + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
};
// представление индикатора выполнения
sw.addPropertyChangeListener(новый PropertyChangeListener() {
@Override
public void propertyChange (PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
ProgressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Событие кнопки «Пуск»
b.addActionListener(новый ActionListener() {
@Override
общественный недействительный actionPerformed (ActionEvent e) {
sw.execute();//Асинхронный вызов SwingWorkder
}
});
// кнопка завершения
b2.addActionListener(новый ActionListener() {
@Override
общественный недействительный actionPerformed (ActionEvent e) {
if (sw != null && !sw.isDone()) {
//Отмена
sw.cancel (истина);
}
JOptionPane.showMessageDialog(null, «Конец!»);
}
});
// представление формы
е.пакет();
f.setVisible(истина);
}
}