Java JFreeChart是否及时推进?

Java JFreeChart是否及时推进?,java,charts,dataset,jfreechart,Java,Charts,Dataset,Jfreechart,我正在制作一个应用程序,其中我需要在图表中显示捕获特定数据的实时性 它的工作原理是,它跟不上实时,它一直在计数,好像时间已经过去了! 我知道它可能链接到此数据集。advanceTime但如果没有它,图形将变为静态,即使实时经过,也不再前进 package com.mycompany.moveplus; import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.

我正在制作一个应用程序,其中我需要在图表中显示捕获特定数据的实时性 它的工作原理是,它跟不上实时,它一直在计数,好像时间已经过去了! 我知道它可能链接到此数据集。advanceTime但如果没有它,图形将变为静态,即使实时经过,也不再前进

package com.mycompany.moveplus;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

public class Atol extends JInternalFrame {

    private static final float MINMAX = 100;
    private static final int COUNT = 2 * 60;
    private Timer timer;

    public Atol() {
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        Date date = new Date();

        final DynamicTimeSeriesCollection dataset
                = new DynamicTimeSeriesCollection(1, 60, new Second());
        dataset.setTimeBase(new Second(date));
        dataset.addSeries(gaussianData(), 0, "Uso de CPU");
        JFreeChart chart = createChart(dataset);

        this.add(new ChartPanel(chart), BorderLayout.CENTER);
        JPanel btnPanel = new JPanel(new FlowLayout());

        SystemInfo si = new SystemInfo();             //Criando uma nova classe de infos do Sistem
        HardwareAbstractionLayer hal = si.getHardware(); //Infos de Hardware do sistema
        CentralProcessor cpu = hal.getProcessor();      //E as informações da cpu
        long[] oldTricks = cpu.getSystemCpuLoadTicks();

        timer = new Timer(100, new ActionListener() {
            
            float cpu() {

                Double stats = cpu.getSystemCpuLoadBetweenTicks(oldTricks);
                //Convertendo o valor de uso da CPU
                stats = stats * 100d;
                double teste = Math.round(stats * 100.0) / 100.0;
                double d = teste;
                float f = (float) d;
                System.out.println(f);
                return f;
            }

            float[] newData = new float[1];

            @Override
            public void actionPerformed(ActionEvent e) {

                newData[0] = cpu();
              //  dataset.advanceTime();
                dataset.appendData(newData);
            }
        });
        timer.start();
    }

    private float[] gaussianData() {

        float[] a = new float[COUNT];
        for (int i = 0; i < a.length; i++) {
            a[i] = 2;
        }
        return a;
    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(
                "", "hh:mm:ss", "CPU%", dataset, true, true, false);
        final XYPlot plot = result.getXYPlot();
        //      DateAxis axis = (DateAxis) plot.getDomainAxis();

        plot.setRangeGridlinePaint(Color.decode("#e8e8e8"));
        plot.setBackgroundPaint(Color.white);
        plot.setOutlinePaint(null);
        plot.setOutlinePaint(null);

        XYItemRenderer renderer = plot.getRenderer();
        renderer.setSeriesPaint(0, Color.decode("#1b6ca8"));

        ValueAxis domain = plot.getDomainAxis();
        domain.setAutoRange(true);
        ValueAxis range = plot.getRangeAxis();
        range.setRange(0, MINMAX);
        return result;
    }

    public void start() {
        timer.start();
    }

    public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Atol demo = new Atol();

                demo.pack();

                demo.setVisible(true);
                demo.start();
            }
        });
    }
}
只有当时间真正流逝时,我如何才能让它进步

我正在重用代码,正如建议的那样,javax.swing.Timer在以连续、同步的方式收集数据时工作良好。相反,以持续的异步方式收集数据可能会阻塞GUI线程。如图所示,切换到SwingWorker只在需要时提供发布的机会。理想情况下,您选择的可能会提供合适的回调,或者您可以简单地等待新数据到达

无论哪种情况,数据中都会有时间间隔。如何处理这一问题的具体细节取决于您的用例,但我已经看到了一些常见的策略:

使用可用功能在信号图中导航整个数据集,如图所示,以及;如有必要,使用建议的空值中断显示;举例说明

将突发数据分离到单独的数据集中,并添加导航控件,如图和所示

正如所建议的,当以连续、同步的方式收集数据时,javax.swing.Timer工作得很好。相反,以持续的异步方式收集数据可能会阻塞GUI线程。如图所示,切换到SwingWorker只在需要时提供发布的机会。理想情况下,您选择的可能会提供合适的回调,或者您可以简单地等待新数据到达

无论哪种情况,数据中都会有时间间隔。如何处理这一问题的具体细节取决于您的用例,但我已经看到了一些常见的策略:

使用可用功能在信号图中导航整个数据集,如图所示,以及;如有必要,使用建议的空值中断显示;举例说明

将突发数据分离到单独的数据集中,并添加导航控件,如图和所示