Java программа паркуется перед выполнением каждой строки в actionPerformed - PullRequest
0 голосов
/ 23 апреля 2020

В программе Swing, которую я пишу, есть кнопка со слушателем действий. В функции actionPerformed для этого ActionListener есть несколько вызовов функций.

Моя проблема заключается в том, что последний вызов функции в actionPerformed пропускается, но он выполняется, если снова нажать кнопку.

Я проверяю это, проходя через программу с помощью отладчика. Я перейду к первой функции, но после возвращения первой функции отладчик останавливается, говоря: «Приложение работает». Если я сделаю паузу, это будет функция с именем park () в Unsafe.class Если я не ошибаюсь, нужно вызвать park, пока программа ожидает ввода, верно?

Вот соответствующий код:

removeDayB.addActionListener(new ActionListener() { //action listener for button being clicked
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        // JFrame a = new RemoveDayDialog(listOfDays); TODO: I don't think this line does anything
        String itemToRemove = comboBox.getSelectedItem().toString();
        if (comboBox.getSelectedItem() == noDaysString) {
            // TODO: Need to handle this case
        } else {
            listOfDays.removeDay(itemToRemove);
            // TODO: This next next line is not getting executed
            refreshComboBox();
        }
    }
});

listOfDays.removeDay(itemToRemove); выполняется, я может вступить в него, и желаемые эффекты имеют место. Проблема в том, что refreshComboBox(); не вызывается. Это просто вспомогательная функция, позволяющая обновлять элементы в комбинированном окне, добавляя элементы из контейнера в другой класс.

Что может быть причиной пропуска этой строки?

РЕДАКТИРОВАТЬ: Комментарий указал на чрезвычайно простую ошибку, которую я совершил. вызов listOfDays.removeDay (itemToRemove) действительно вызывал исключение. Я знакомлюсь с новой IDE и, по-видимому, при отладке не вижу исключения. После того, как я запустил программу за пределами отладчика, было сгенерировано исключение, и ошибка, с которой я столкнулся, стала ясной.

public void removeDay(CharSequence str) {
    for (Day day : days) {
        if (day.getDateAsString().equals(str)) {
            days.remove(day);
        }
    }
}

Исключение было связано с параллелизмом, я думаю, что удаление элемента из дней (ArrayList) в то время как все еще итерации это нет-нет. Исправлено добавлением перерыва после days.remove(day)

1 Ответ

0 голосов
/ 30 апреля 2020

В зависимости от вашего отладчика, если listOfDays.removeDay выдает исключение, оно будет выглядеть так, как будто ваш actionListener завершает свой метод, но на самом деле он заканчивается рано.

Это также может быть сложно определить, потому что , EDT напечатает трассировку стека и продолжит обработку последующих событий.

...