0

I am trying to plot values from a csv file into a graph, using Java, JFreeChart and using the MVC concept. At the minute, I have created a button, and when this button is clicked it adds a new plot to the graph, however instead of doing this, I would like it to read in the values from the csv file, which is read in by a csv file adapter and stored in the model. I wondering if anyone could help me with this. I would appreciate any help that could be given. Thank you

//Main Class

public class Main
{
    public static void main(String[] args) {           
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                                           
                Model model = new Model(0);

                Controller controller = new Controller(model);
                View view = new View(controller, "-");


                view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                view.setVisible(true);
            }
        });  
    }
}

//csv file adapter

public List<Double> readFile(final String filename)
    {
        List<Double> result = new ArrayList<Double>();

        String csvFile = filename;
        BufferedReader br = null;
        String line = "";
        String splitBy = ",";

        try {

            br = new BufferedReader(new FileReader(csvFile));
            while((line = br.readLine()) != null){

                String[] test = line.split(splitBy);
                System.out.println("csvFile [Value= " + test[0] + ", Value=" + test[1] + ", Value=" + test[2] + "]");
                try
                {
                    for (String val : test)
                    {
                        final Double valueToAdd = Double.parseDouble(val);
                        result.add(valueToAdd);
                    }
                }
                catch (NumberFormatException nfe)
                {
                    System.out.println("Failed to parse line: " + line);
                }
            }   
        }
        catch(FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally{
            if (br != null){
                try{
                    br.close();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
        }

        return result;
    }
}

//model

public class Model {

  private int x;

    public Model(){
        x = 0;
    }

    public Model(int x){
        this.x = x;
    }

    public void incX(){
        x++;
    }

    public int getX(){
        return x;
    }

    public void addDataset(final List<Double> data)
    {
        System.out.println("Added data to model");
        for (Double d : data)
        {
            System.out.println("Value: " + d.toString());
        }
    }
}

//view

public class View extends JFrame
{
    private Controller controller;

    private JFrame frame;
    private JLabel label;
    private JButton button;
    private ChartDisplayWidget myChart;

    public View(Controller c, String text){
        this.controller = c;
        getContentPane().setLayout(new BorderLayout());                                          
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
        setSize(1000,1000);        

        //label = new JLabel(text);
        //getContentPane().add(label, BorderLayout.CENTER);

        button = new JButton("Button");        
        getContentPane().add(button, BorderLayout.SOUTH); 
        button.addActionListener(new Action());

        myChart = new ChartDisplayWidget();
        getContentPane().add(myChart, BorderLayout.CENTER);
    }

    public class Action implements ActionListener {

        public void actionPerformed (ActionEvent e){
            System.out.println("I was clicked");
            controller.control();
            myChart.addTimeSeriesPerformancePlot("NewPlot", new Double[] {60.0, 40.0, 500.0, 10.0});    

               /*this is where I would like to plot the values from the csv file*/
        }
   }

    public JButton getButton(){
        return button;
    }

    public void setText(String text){
        label.setText(text);
    }
}

//controller

public class Controller {

    public Model model;
    public ActionListener actionListener;

    public Controller(Model model){
        this.model = model;
    }

    public void control(){        
        CSVFileAdapter c = new CSVFileAdapter();
        model.addDataset(c.readFile("C:/dstat.csv"));

    }
}

//Chart Display Widget

public class ChartDisplayWidget extends JPanel
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private TimeSeriesCollection chartData;
    private JFreeChart chart;

    public ChartDisplayWidget()
    {
        init();
    }

    public void init()
    {
        final XYDataset dataset = getSampleData();

        chart = ChartFactory.createTimeSeriesChart(
                "Our test chart",
                "Time",
                "Some Value",
                dataset);

        final ChartPanel chartPanel = new ChartPanel(chart); 

        add(chartPanel);
    }

    public void addTimeSeriesPerformancePlot(final String plotName, final Double[] values)
    {
        final TimeSeries newSeries = new TimeSeries(plotName);

        int arrLen = values.length;
        int monthIndex = 2;
        int yearIndex = 2001;
        for (int index = 0; index < arrLen; index++)
        {
            newSeries.add(new Month(monthIndex++, yearIndex++), values[index]);
        }
        chartData.addSeries(newSeries);
    }

    private XYDataset getSampleData()
    {
        TimeSeries s1 = new TimeSeries("Max CPU");

        s1.add(new Month(2, 2001), 181.5);
        s1.add(new Month(3, 2001), 20.5);
        s1.add(new Month(4, 2001), 1.1);
        s1.add(new Month(5, 2001), 81.5);
        s1.add(new Month(6, 2001), 1181.5);
        s1.add(new Month(7, 2001), 1081.5);

        TimeSeries s2 = new TimeSeries("Disk I/O");

        s2.add(new Month(2, 2001), 50.0);
        s2.add(new Month(3, 2001), 55.0);
        s2.add(new Month(4, 2001), 60.6);
        s2.add(new Month(5, 2001), 70.8);
        s2.add(new Month(6, 2001), 1000.1);
        s2.add(new Month(7, 2001), 1081.5);

        chartData = new TimeSeriesCollection();
        chartData.addSeries(s1);
        chartData.addSeries(s2);

        return chartData;
    }
}
user3216736
  • 19
  • 1
  • 5

1 Answers1

1

Use the observer pattern: update the model, an unspecified implementation XYDataset, and the listening view will update itself in response. Examples are seen here and here. Because file latency is inherently unpredictable, read the file in the background thread of a SwingWorker, publish() intermediate results, and update the model in process(); a JFreeChart example is shown here.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045