gpt4 book ai didi

java - 如何使用 JFreeChart 动态更新图表?

转载 作者:行者123 更新时间:2023-12-01 11:13:13 27 4
gpt4 key购买 nike

我正在尝试动态生成一个图表,以显示值随时间的变化。我将这些值存储在 ArrayList< Integer, ArrayList<Integer>> 中并在此类中检索这些值。但它没有显示 ArrayList 中的值的添加。随着时间的推移。

这里实际上还有两个线程正在更新 ArrayList我需要显示 Arraylist 的值在动态图表中。

下面是基于这个example的代码:

package com.model.presentation;

import java.awt.BorderLayout;
import java.awt.Dimension;
//import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
//import java.util.Random;
import java.util.Map.Entry;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.Timer;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

import com.model.resources.Household;

/**
* @see https://stackoverflow.com/a/15715096/230513
* @see https://stackoverflow.com/a/11949899/230513
*/

public class DisplayChart {

//private static final int N = 128;
//private static final Random random = new Random();
private int n = 1;
static int count = 0;

public void display()
{
JFrame f = new JFrame("Community Rescilience Model");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTabbedPane jtp = new JTabbedPane();
jtp.add(String.valueOf(n), createPane());
f.add(jtp, BorderLayout.CENTER);
JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));
p.add(new JButton(new AbstractAction("Add") {
public void actionPerformed(ActionEvent e) {
jtp.add(String.valueOf(++n), createPane());
jtp.setSelectedIndex(n - 1);
}
}));
f.add(p, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

private ChartPanel createPane()
{
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

final String name = "Community ";

/* for (int i = 0; i < random.nextInt(N) + N / 2; i++)
{

while (iterator.hasNext())
{
Map.Entry map = (Map.Entry) iterator.next();
String community_name = name + String.valueOf(map.getKey());
ArrayList<Integer> dataArrayList = (ArrayList<Integer>) map.getValue();
for (Iterator<Integer> it = dataArrayList.iterator(); it.hasNext();)
{
dataset.addValue(it.next(), community_name, String.valueOf(count));
count++;
}
}
}*/
// XYSeriesCollection dataset = new XYSeriesCollection(series);
new Timer(100, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Iterator<Entry<Integer, ArrayList<Integer>>> iterator = Household.goods.entrySet()
.iterator();
while (iterator.hasNext())
{
Map.Entry map = (Map.Entry) iterator.next();
String community_name = name + String.valueOf(map.getKey());
ArrayList<Integer> dataArrayList = (ArrayList<Integer>) map.getValue();
for (Iterator<Integer> it = dataArrayList.iterator(); it.hasNext();)
{
dataset.setValue(it.next(), community_name, String.valueOf(count));
count++;
}
}
}

}).start();
JFreeChart lineChart = ChartFactory.createLineChart("Resource Production/Consumption over time", "Time",
"Number of GOODS", dataset, PlotOrientation.VERTICAL,
true, true, false);
return new ChartPanel(lineChart) {
@Override
public Dimension getPreferredSize()
{
return new Dimension(1000, 500);
}
};
}


/*public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DisplayChart().display();
}
});
}
}*/

}

主类是:

public class Main_class {

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new DisplayChart().display();
}
});
}

这段代码可以工作,但在某些时候,它会卡住。这意味着它不显示 Arraylist 中的更改值.

最佳答案

我让它无限期地运行,尽管我不确定它是否仍然按您的预期工作。

我没有上过 Household 类(class),所以我只是用它来伪造它。

class Household {
static public Map<Integer, ArrayList<Integer>> goods = new HashMap<>();
}

我也不认为我有用于向绘图添加数据的代码。我是这样做的:

Random rand = new Random();
while (true) {
try {
Thread.sleep(100);
for (int i = 0; i < 10; i++) {
final int fi = i;
EventQueue.invokeLater(new Runnable() {
public void run() {
ArrayList<Integer> l = Household.goods.get(fi);
if (l == null) {
l = new ArrayList<>();
}
l.add(rand.nextInt(100));
if (l.size() > 20) {
l.remove(0);
}
Household.goods.put(fi, l);
}
});
}
} catch (InterruptedException ex) {
}
}

请注意,在 EventQueue 线程中执行此操作很重要,否则您将收到 ConcurrentModificationException。

真正的问题似乎是您在列表中一遍又一遍地添加与不同计数相关的相同数据。

所以我改变了:

    for (Iterator<Integer> it = dataArrayList.iterator(); it.hasNext();)
{
dataset.setValue(it.next(), community_name, String.valueOf(count));
count++;
}

致:

for (count = 0; count < dataArrayList.size(); count++) {
dataset.setValue(dataArrayList.get(count), community_name, String.valueOf(count));
}

关于java - 如何使用 JFreeChart 动态更新图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com