Swing Timer и ActionListener с StackOverflowError

У меня есть домашняя работа, которую я пробовал в течение долгого времени и даже спрашивал об этом профессора, но до сих пор не понимаю, что пошло не так в этом коде. Я абсолютно не знаю, как инициализировать время (в конструкторе SoilTempData) и не уверен, что не так с ошибкой, поэтому я понятия не имею, как ее исправить. Я также не могу сильно менять коды, потому что вопросы остаются структурой данного кода. [Это данная диаграмма][1]

package Iot;
import java.util.ArrayList;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SoilTempData implements ActionListener{
    private final int REPORT_ROUND = 1000/100;
    ArrayList<Integer> data;
    private int round;
    private int nextPrintIndex;
    private Timer time;
    private SoilTempIoT iot;
    public SoilTempData(SoilTempIoT iot){
        data = new ArrayList<>(10);
        round = 0;
        nextPrintIndex = 0;
        time = new Timer(100, new SoilTempData(iot));
        iot = new SoilTempIoT();
    }
    public void start() {
        time.start();
    }
    public void actionPerformed(ActionEvent e){
        if(!(round == REPORT_ROUND))
            time.start();
        else
            printStat();
    }
    public void printStat() {
        int min = data.get(nextPrintIndex);
        int max = data.get(nextPrintIndex);
        int sum = 0;
        double average = 0.0;
        double sd = 0.0;
        System.out.println("********** Report Current Data: **********");
        System.out.print("New set of data: ");
        for(int i = nextPrintIndex ; i < data.size() ; i++) {
            System.out.print(data.get(i) +", ");
            sum += data.get(i);
            round++;
        }
        average = sum/data.size();
        for(int i = nextPrintIndex ; i < data.size() ; i++) {
            sd += Math.pow((data.get(i) - average),2);
        }
        System.out.printf("\nTotal records: %d\n",REPORT_ROUND*round);
        System.out.println("Statistics:");
        if(!data.isEmpty()) {
            System.out.printf("Min = %.2f\nMax = %.2f\nAverage = %.2f\nSD = %.2f\n",min,max,average,sd);
        }
        else
            System.out.println("No data to report!");
        nextPrintIndex = REPORT_ROUND*round;
    }
}

а это SoilTempIoT

package Iot;

import java.awt.event.ActionListener;
import java.util.Random;

public class SoilTempIoT {
    public static final int MIN_TEMP = 10;
    public static final int MAX_TEMP = 60;
    private int temp;
    private Random rand;
    public SoilTempIoT() {
        rand = new Random();
        temp = rand.nextInt(50) + 10;
    }
    public int getTemp() {
        int i = rand.nextInt(21) - 10;
        return temp+i;
    }
}

и основной класс (который ничего не может изменить из-за вопроса, но если кто-то захочет взглянуть на него)

package Iot;
import javax.swing.JOptionPane;

public class SoilTempDataTest {
    public static void main(String[] args) {
        SoilTempData sensor = new SoilTempData(new SoilTempIoT());
        sensor.printStat();
        sensor.start();
        JOptionPane.showMessageDialog(null, "Quit?");
        System.exit(0);
    }
}

Если мой вопрос не очень хорош, пожалуйста, скажите мне, что я исправлюсь сверхурочно.

Обновлено: мне также нужно сделать так, чтобы SoilTempData считывал данные из SoilTempIoT 100 мс и каждые 1000 мс распечатывал Stat. [1]: https://i.stack.imgur.com/VDefv.png

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
   public SoilTempData(SoilTempIoT iot){
       data = new ArrayList<>(10);
       round = 0;
       nextPrintIndex = 0;
       time = new Timer(100, new SoilTempData(iot));
       iot = new SoilTempIoT();
   }

Когда вы инициализируете time, вы создаете другой экземпляр. Это вызывает тот же конструктор, который инициализирует time, который создает другой экземпляр и т. д.

Просто используйте time = new Timer(100, this);

Могу я спросить, в чем разница между «этим» и «новым SoilTempData(iot)»? Это потому, что «новый» создает новый экземпляр и использует его, а «этот» просто использует тот же самый, не создавая новый экземпляр?

Nooboolean 23.04.2022 14:08

@Noobolean точно. this всегда относится к текущему экземпляру в Java.

Rob Spoor 23.04.2022 14:14

Другие вопросы по теме