1

Well basically what my program does is that I have a csv file that reads in the milliseconds (which I converted) and a letter that represents a zone. I am trying to display it as a bar chart but I have different tabs that each letter (zone) goes to. My issue is trying to send the letter (from file) to the specific zone which I made in tabs. Maybe I am missing something but I am not sure. Any help will be much appreciated.

Here is my code:

@SuppressWarnings({ "serial", "deprecation" })
public class InductionTreeGraph extends JFrame {

static TimeSeries ts = new TimeSeries("data", Millisecond.class);

public static void add(JTabbedPane jtp, String label, int mnemonic, AbstractButton button1)
{
    int count = jtp.getTabCount();
    JButton button = new JButton(label);
    button.setBackground(Color.WHITE);
    jtp.addTab(label, null, button, null);
    jtp.setMnemonicAt(count, mnemonic);

}

public InductionTreeGraph() throws Exception {

        final XYDataset dataset = (XYDataset) createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(1000, 400));
        setContentPane(chartPanel);

        JFrame frame = new JFrame("Induction Zone Chart");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTabbedPane jtp = new JTabbedPane();
        jtp.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        String zones[] = {"Zone A", "Zone B", "Zone C", "Zone S",
                "Zone SH","Zone W"};
        int mnemonic[] = {KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C,
                KeyEvent.VK_S, KeyEvent.VK_H,KeyEvent.VK_W};

        for (int i = 0, n=zones.length; i<n; i++)
        {
            AbstractButton button1 = null;
            InductionTreeGraph.add(jtp, zones[i], mnemonic[i], button1);
        }

        final JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        p.add(new JButton(new AbstractAction("Update") {

             public void actionPerformed(ActionEvent e) {
                chartPanel.repaint();
             }

        }));

        frame.add(jtp, BorderLayout.NORTH);
        frame.add(p, BorderLayout.SOUTH);
        frame.getContentPane().add(chartPanel);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);

}

    @SuppressWarnings("deprecation")
    private XYDataset createDataset() {
        final TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(ts);

        TreeMap<String,TreeMap<Integer,Integer[]>> zoneMap = getInductions("","");
        // Iterate through all zones and print induction rates for every minute into
        // every hour by zone...
        Iterator<String> zoneIT = zoneMap.keySet().iterator();
        while (zoneIT.hasNext())
        {
            String zone = zoneIT.next();
            TreeMap<Integer,Integer[]> hourCountsInZoneMap = zoneMap.get(zone);
            System.out.println("ZONE " + zone + " : ");
            Iterator<Integer> hrIT = hourCountsInZoneMap.keySet().iterator();
            while (hrIT.hasNext())
            {
                int hour = hrIT.next();
                Integer [] indRatePerMinArray = hourCountsInZoneMap.get(hour);
                for (int i=0; i< indRatePerMinArray.length; i++)
                {
                    System.out.print(hour + ":");
                    System.out.print(i < 10 ? "0" + i : i);
                    System.out.println(" = " + indRatePerMinArray[i] + " induction(s)");
                }
            }
        }

        return dataset;
}

    @SuppressWarnings("deprecation")
    private JFreeChart createChart(XYDataset dataset) {
        final JFreeChart chart = ChartFactory.createXYBarChart(
                "Induction Zone Chart", 
                "Hour", 
                true,
                "Inductions Per Minute", 
                (IntervalXYDataset) dataset, 
                PlotOrientation.VERTICAL,
                false, 
                true, 
                false
        );

        XYPlot plot = (XYPlot)chart.getPlot();
        XYBarRenderer renderer = (XYBarRenderer)plot.getRenderer();
        renderer.setBarPainter(new StandardXYBarPainter());
        renderer.setDrawBarOutline(false);
        ValueAxis axis = plot.getDomainAxis();
            axis.setAutoRange(true);
            axis.setFixedAutoRange(60000.0);

        // Set an Induction target of 30 per minute
        Marker target = new ValueMarker(30);
        target.setPaint(java.awt.Color.blue);
        target.setLabel("Induction Rate Target");
        plot.addRangeMarker(target);

        return chart;
    }

private TreeMap<String, TreeMap<Integer, Integer[]>> getInductions(String mills, String zone) {

    // TreeMap of Inductions for Every Minute in Day Per Zone...
    // Key = Zone
    // Value = TreeMap of Inductions per Minute per Hour:
    //          Key = Hour
    //          Value = Array of 60 representing Induction Rate Per Minute
    //                  (each element is the induction rate for that minute)
    TreeMap<String, TreeMap<Integer, Integer[]>> zoneMap = new TreeMap<String, TreeMap<Integer, Integer[]>>();

    // Input file name...
    String fileName = "/home/a002384/ECLIPSE/IN070914.CSV";

    try 
    {
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String line;
        try
        {
            // Read a line from the csv file until it reaches to the end of the file...
            while ((line = br.readLine()) != null)
            {
                // Parse a line of text in the CSV...
                String [] indData = line.split("\\,");
                long millisecond = Long.parseLong(indData[0]);
                String zone1 = indData[1];

                // The millisecond value is the number of milliseconds since midnight.
                // From this, we can derive the hour and minute of the day as follows:
                int secOfDay = (int)(millisecond / 1000);
                int hrOfDay = secOfDay / 3600;
                int minInHr = secOfDay % 3600 / 60;

                // Obtain the induction rate TreeMap for the current zone.
                // If this is a "newly-encountered" zone, create a new TreeMap.
                TreeMap<Integer, Integer[]> hourCountsInZoneMap;
                if (zoneMap.containsKey(zone1))
                    hourCountsInZoneMap = zoneMap.get(zone1);
                else
                    hourCountsInZoneMap = new TreeMap<Integer, Integer[]>();

                // Obtain the induction rate array for the current hour in the current zone.
                // If this is a new hour in the current zone, create a new array,
                // and initialize this array with all zeroes.
                // The array is size 60, because there are 60 minutes in the hour.
                // Each element in the array represents the induction rate for that minute.
                Integer [] indRatePerMinArray;
                if (hourCountsInZoneMap.containsKey(hrOfDay))
                    indRatePerMinArray = hourCountsInZoneMap.get(hrOfDay);
                else
                {
                    indRatePerMinArray = new Integer[60];
                    Arrays.fill(indRatePerMinArray, 0);
                }

                // Increment the induction rate for the current minute by one.
                // Each line in the csv file represents a single induction at a
                // single point in time.
                indRatePerMinArray[minInHr]++;

                // Add everything back into the TreeMaps if these are newly-created.
                if (!hourCountsInZoneMap.containsKey(hrOfDay))
                    hourCountsInZoneMap.put(hrOfDay, indRatePerMinArray);
                if (!zoneMap.containsKey(zone1))
                    zoneMap.put(zone1, hourCountsInZoneMap);

            }
        }
        finally
        {
            br.close();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return zoneMap;
}

@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
    try {
        InductionTreeGraph dem = new InductionTreeGraph();
        dem.pack();
        dem.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        while(true) {
            double millisecond = 2;
            double num = millisecond;
            System.out.println(num);
            ts.addOrUpdate(new Millisecond(), num);
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

}
Lance Roberts
  • 22,383
  • 32
  • 112
  • 130
c.torres
  • 31
  • 1
  • 6

1 Answers1

3

My very first suggestion is about this line:

setContentPane(chartPanel);

Don't mess with content pane. Use this line instead:

getContentPane().add(chartPanel);

The prooblem I see in your code is that InductionTreeGraph extends from JFrame and you are setting this chartPanel as this frame's content pane, but then you use a new JFrame local variable (called frame) and add this chartPanel to this frame as well:

JFrame frame = new JFrame("Induction Zone Chart");
...
frame.getContentPane().add(chartPanel);

Swing components are intended to be used "as is" so it's preferable composition over inheritance. Having said this you should consider remove extends JFrame on your class declaration and add all your components (chart panel, buttons, etc) to this local frame instead.


Related

You may want to take a look to the example shown in this Q&A. This or any @trashgod's examples in Stack Overflow about JFreeChart (f.e. this one) might help you to better structure your code.

Community
  • 1
  • 1
dic19
  • 17,821
  • 6
  • 40
  • 69
  • 1
    +1 @user3841414 See [Extends JFrame vs. creating it inside the the program](http://stackoverflow.com/q/22003802/2587435) – Paul Samsotha Jul 15 '14 at 15:34