Populate JFreechart TimeSeriesCollection from Mysql DB?

后端 未结 1 933
臣服心动
臣服心动 2020-11-29 13:08

I\'m trying to make a chart in my application that returns me the temperature of days during the months.

This chart is a JFreechart TimeSeriesCollection, and I am u

相关标签:
1条回答
  • 2020-11-29 13:31

    I suspect that you're losing precision in the conversion of a String to a Date. This complete example creates a suitable database table in memory, queries it into a JDBCXYDataset and displays the dataset in a time series chart. Note that JDBCXYDataset recognizes time series data. As a check, the JDBCXYDataset is queried for the returned date values.

    image

    Typical hourly data:

    …
    Jul 15, 2014 1:10:25 PM
    Jul 15, 2014 2:10:25 PM
    Jul 15, 2014 3:10:25 PM
    Jul 15, 2014 4:10:25 PM
    Jul 15, 2014 5:10:25 PM
    Jul 15, 2014 6:10:25 PM
    …
    

    Code:

    import java.awt.EventQueue;
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Timestamp;
    import java.text.DateFormat;
    import java.util.Calendar;
    import java.util.Random;
    import javax.swing.JFrame;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.jdbc.JDBCXYDataset;
    
    /**
     * @see http://stackoverflow.com/a/24762078/230513
     */
    public class JDBCTest {
    
        private static final int N = 24;
        private static final Random r = new Random();
    
        private void display() {
            JFrame f = new JFrame("JDBCTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JDBCXYDataset jds = createDataset();
            JFreeChart chart = ChartFactory.createTimeSeriesChart(
                "Inventory", "Date", "Count", jds, true, true, false);
            f.add(new ChartPanel(chart));
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
            for (int i = 0; i < jds.getItemCount(); i++) {
                System.out.println(DateFormat.getDateTimeInstance()
                    .format(new Date(jds.getX(0, i).longValue())));
            }
        }
    
        private JDBCXYDataset createDataset() {
            try {
                Connection conn = DriverManager.getConnection(
                    "jdbc:h2:mem:test", "", "");
                Statement st = conn.createStatement();
                st.execute("create table inventory(when timestamp, n1 integer, n2 integer)");
                PreparedStatement ps = conn.prepareStatement(
                    "insert into inventory values (?, ?, ?)");
                Calendar c = Calendar.getInstance();
                for (int i = 0; i < N; i++) {
                    ps.setTimestamp(1, new Timestamp(c.getTimeInMillis()));
                    ps.setInt(2, N / 3 + r.nextInt(N / 2));
                    ps.setInt(3, N / 2 + r.nextInt(N / 2));
                    ps.execute();
                    c.add(Calendar.HOUR_OF_DAY, 1);
                }
                JDBCXYDataset jds = new JDBCXYDataset(conn);
                jds.executeQuery("select when, n1, n2 from inventory");
                return jds;
            } catch (SQLException ex) {
                ex.printStackTrace(System.err);
            }
            return null;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new JDBCTest().display();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题