#java #swing #swingworker
#java #swing #swingworker
Вопрос:
Я создаю очень простое приложение для визуализации алгоритмов сортировки и использую SwingWorker
для рисования массива несколько раз в секунду.
Если пользователь нажимает кнопку «Сброс», массив повторно перетасовывается, и теперь он может выбрать, какой алгоритм сортировки использовать снова.
Моя проблема в том, что после сброса метод execute() больше не вызывается doInBackground()
, даже после создания нового экземпляра SwingWorker
.
Как я могу сделать так, чтобы я мог вызывать execute()
столько раз, сколько необходимо?
public void actionPerformed(ActionEvent event) {
stopSort = false;
doBubbleSort = false;
doSelectionSort = false;
doInsertionSort = false;
if (event.getSource() == bubbleButton) {
doBubbleSort = true;
sort.execute();
} else if (event.getSource() == selectionButton) {
doSelectionSort = true;
sort.execute();
} else if (event.getSource() == insertionButton) {
doInsertionSort = true;
sort.execute();
} else if (event.getSource() == resetButton) {
reset();
sort.execute();
}
}
public void reset() {
displayArr.clearSwappedIndexes();
displayArr.setFramesPainted(0);
displayArr.setComplete(false);
stopSort = true;
shuffleArr(arr);
sort = new Sorting(this, arr, displayArr);
}
Ответ №1:
Если пользователь нажимает кнопку «Сброс», массив перетасовывается заново, и теперь он может выбрать, какой алгоритм сортировки использовать снова.
else if (event.getSource() == resetButton) {
reset();
sort.execute();
}
Мне кажется, что вы немедленно запускаете SwingWorker и не даете пользователю возможности выбрать алгоритм сортировки. Итак, когда пользователь нажимает кнопку сортировки, рабочий уже использовался.
Я бы подумал, что код должен быть:
else if (event.getSource() == resetButton) {
reset();
//sort.execute(); // remove
}
Комментарии:
1. Это работает, и теперь я чувствую себя глупо, потому что я этого не видел… ну что ж. Спасибо!