代码之家  ›  专栏  ›  技术社区  ›  Nooboolean

带StackOverflowerr的Swing定时器和ActionListener

  •  -1
  • Nooboolean  · 技术社区  · 3 年前

    我有一个作业,我试了很长时间,甚至问了教授,但仍然不明白这段代码出了什么问题。我完全不知道如何初始化时间(在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 100ms读取数据,每1000ms打印一次数据。 [1]: https://i.stack.imgur.com/VDefv.png

    1 回复  |  直到 3 年前
        1
  •  2
  •   Rob Spoor    3 年前
       public SoilTempData(SoilTempIoT iot){
           data = new ArrayList<>(10);
           round = 0;
           nextPrintIndex = 0;
           time = new Timer(100, new SoilTempData(iot));
           iot = new SoilTempIoT();
       }
    

    初始化时 time ,则创建另一个实例。调用相同的构造函数,初始化 时间 ,从而创建另一个实例,等等。

    使用 time = new Timer(100, this);