2015-08-20 6 views
0

Я пытаюсь создать диаграмму динамически, которая будет показывать изменение стоимости с течением времени. Я сохраняю эти значения в ArrayList< Integer, ArrayList<Integer>> и извлекаю эти значения в этом классе. Но он не показывает добавление значений в этом ArrayList с течением времени.Как обновить диаграмму динамически с помощью JFreeChart?

Здесь на самом деле еще два потока обновляют это значение 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.

+1

Возможные [duplicte] (http://stackoverflow.com/q/15707496/230513). – trashgod

ответ

1

У меня есть работа на неопределенное время, хотя я не уверен, что он все еще работает так, как вы намеревались.

У меня не было класса «Домохозяйство», поэтому я просто подделал его.

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++; 
    } 

To:

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

Для справки, полная оригинальная программа видна [здесь] (http://stackoverflow.com/a/15715096/230513). – trashgod

Смежные вопросы