【问题标题】:Dynamic JFreeChart TimeSeries动态 JFreeChart 时间序列
【发布时间】:2021-03-16 12:49:31
【问题描述】:

[编辑] 基于这个example,我是now able来收集数据并显示在图表中。我不知道如何将生成图表的代码集成到我的应用程序中。

/** @see http://stackoverflow.com/questions/5048852 */
public class Atol extends ApplicationFrame {

private static final String TITLE = "Dynamic Series";
private static final String START = "Start";
private static final String STOP = "Stop";
private static final float MINMAX = 100;
private static final int COUNT = 2 * 60;
private static final int FAST = 100;
private static final int SLOW = FAST * 5;
private static final Random random = new Random();
private Timer timer;

public Atol(final String title) {
    super(title);
    final DynamicTimeSeriesCollection dataset
            = new DynamicTimeSeriesCollection(1, COUNT, new Second());
    dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2011));
    dataset.addSeries(gaussianData(), 0, "Gaussian data");
    JFreeChart chart = createChart(dataset);

    final JButton run = new JButton(STOP);
    run.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            if (STOP.equals(cmd)) {
                timer.stop();
                run.setText(START);
            } else {
                timer.start();
                run.setText(STOP);
            }
        }
    });

    final JComboBox combo = new JComboBox();
    combo.addItem("Fast");
    combo.addItem("Slow");
    combo.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if ("Fast".equals(combo.getSelectedItem())) {
                timer.setDelay(FAST);
            } else {
                timer.setDelay(SLOW);
            }
        }
    });
   this.add(new ChartPanel(chart), BorderLayout.CENTER);
   JPanel btnPanel = new JPanel(new FlowLayout());
   btnPanel.add(run);
    btnPanel.add(combo);
    this.add(btnPanel, BorderLayout.SOUTH);
    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(FAST, 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);
        }
    });
}


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(
            TITLE, "hh:mm:ss", "milliVolts", dataset, true, true, false);
    final XYPlot plot = result.getXYPlot();
    ValueAxis domain = plot.getDomainAxis();
    domain.setAutoRange(true);
    ValueAxis range = plot.getRangeAxis();
    range.setRange(-MINMAX, 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(TITLE);
            demo.pack();

            demo.setVisible(true);
            demo.start();
        }
    });
}

}

致我的JFrame 代码(在另一个类中):

   private void kButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // when I click in that button
    
    Atol demo = new Atol ("");       
   chartCPU.add(new ChartPanel(demo)); //Thats the JPanel the chart need to appear and readjust to it size

}

如果JFreeChart 在一个构造函数中,我如何在 Atol 类中调用图表(JFreeChart 图表)?我没有得到! 我怎样才能让它出现在我的chartCPUJPanel 中? (这是一个名为TelaLoginJFrame 类,与Atol 类不同)。

【问题讨论】:

  • 检查了几种方法here
  • 我不明白如何从随机值更改为我的双重统计数据
  • 不是重新创建整个图表,而是通过添加新值和刻度来更新数据集。
  • 我试图改变 gaussianData() 来更新我的 cpu() 但现在我可以改变我的值了!你能检查我的编辑并帮助我吗?
  • 冻结表明您正在阻止event dispatch thread;试试这个approach;另外,请edit您的问题包括一个最小的可重复示例,以显示您修改后的方法;检查了一个相关问题here

标签: java swing dataset jframe jfreechart


【解决方案1】:

您的original question 询问如何捕获 CPU 数据并将其显示在图表中。由于相关方法的延迟较低,因此可以在javax.swing.Timer 的动作监听器中调用该方法,如here 及以上所示。

具有不可预测延迟的数据访问可能会阻塞event dispatch thread,在这种情况下,您应该改用SwingWorker,如here 所示。

要将图表集成到您的应用程序中,请将示例的构造函数重构为工厂方法并采用以下方法之一:

  • CardLayout,显示为here

  • JTabbedPane,显示为here

  • JInternalFrame,显示为herehere

【讨论】:

  • 我使用了一个 JInternaFrame,它成功了!谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多