【问题标题】:Populate JFreechart TimeSeriesCollection from Mysql DB?从 Mysql DB 填充 JFreechart TimeSeriesCollection?
【发布时间】:2014-09-05 19:38:46
【问题描述】:

我正在尝试在我的应用程序中制作一个图表,以返回几个月中的几天温度。

此图表是 JFreechart TimeSeriesCollection,我无法让图表从数据库中读取正确的数据。

它显示了一些值,但不是全部,并且没有显示正确的时间。

为了解决这个问题,我尝试实现here 发布的图表,但仍然无法解决我的问题,即使按照人们的建议去看了question

public class NewClass extends ApplicationFrame {

Connection conexao = null;
PreparedStatement pst= null;
ResultSet rs = null;

public NewClass(String title) throws SQLException, ParseException {
    super(title);
    ChartPanel chartPanel = (ChartPanel) createDemoPanel();
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
    setContentPane(chartPanel);


}


private static JFreeChart createChart(XYDataset dataset) {

    JFreeChart chart = ChartFactory.createTimeSeriesChart(
        "Temperatura/Date",  // title
        "Date",             // x-axis label
        "Temperatura",   // y-axis label
        dataset,            // data
        true,               // create legend?
        true,               // generate tooltips?
        false               // generate URLs?
    );


    XYPlot plot = (XYPlot) chart.getPlot();

    DateAxis axis = (DateAxis) plot.getDomainAxis();
    axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));

    return chart;

}


private static XYDataset createDataset() throws SQLException, ParseException {
    Connection con = null;
    String databaseURL = "jdbc:mysql://localhost:3306/world";
    String driverName = "com.mysql.jdbc.Driver";
    String user = "root";
    String password = "rootadmin";
    try {
        Class.forName(driverName).newInstance();
    } catch (Exception ex) {
        System.out.println("");
    }

        con = (Connection) DriverManager.getConnection(databaseURL, user, password);

        if (!con.isClosed()) {
            System.out.println("Successfully connected to the DataBase Server...");
        }


        Statement statement;
        statement = (Statement) con.createStatement();

        String selectQuery = "select (CONCAT(`data_registo`, ' ', hora_registo)) as data,  temperatura, idSensor from registos where idSensor like 'BrgTH001' ";
        ResultSet resultSet = null;
        resultSet = statement.executeQuery(selectQuery);




    TimeSeries s1 = new TimeSeries("Thermomether01");
    while (resultSet.next()) {

                String idSensor = (String) resultSet.getObject("idSensor");
                String data = (String) resultSet.getObject("data");
                String temperatura = (String) resultSet.getObject("temperatura");

                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                Date dateI = sdf2.parse(data);


                System.out.println("" + idSensor + " " + data + "   " + temperatura+ "   |   " );


                s1.addOrUpdate(new Hour(dateI), value);



            } 

        resultSet.close();



    TimeSeriesCollection dataset = new TimeSeriesCollection();
    dataset.addSeries(s1);


    return dataset;


}

public static JPanel createDemoPanel() throws SQLException, ParseException {
    JFreeChart chart = createChart(createDataset());
    ChartPanel panel = new ChartPanel(chart);
    panel.setFillZoomRectangle(true);
    panel.setMouseWheelEnabled(true);
    return panel;
}


public static void main(String[] args) throws SQLException, ParseException {

    NewClass demo = new NewClass("Chart");
    demo.pack();
    demo.setVisible(true);

}

}

这是我的代码生成的图表。 但是查询的结果是:

Thermomether01 2014-04-01 08:47:11   23.8   |   
Thermomether01 2014-04-01 08:47:11   23.8   |   
Thermomether01 2014-04-01 08:51:20   23.9   |   
Thermomether01 2014-04-01 08:53:24   23.9   |   
Thermomether01 2014-04-01 08:55:28   23.9   |   
Thermomether01 2014-04-01 09:43:26   24.1   |   
Thermomether01 2014-04-01 09:48:39   24.0   |   
Thermomether01 2014-04-01 09:50:44   24.1   |   
Thermomether01 2014-04-01 09:52:48   24.0   |   
Thermomether01 2014-04-01 09:54:52   24.1   |   
Thermomether01 2014-04-01 09:56:56   24.1   |   
Thermomether01 2014-04-01 09:59:01   24.1   |   
   .
   .
   .
Thermomether01 2014-06-13 09:35:36   19.2   |   
Thermomether01 2014-06-13 10:03:00   18.7   |   
Thermomether01 2014-06-13 10:33:41   19.0   |   
Thermomether01 2014-06-16 08:57:57   19.1   |   
Thermomether01 2014-06-16 09:07:54   18.9   |   
Thermomether01 2014-06-16 09:08:40   19.0   |   
Thermomether01 2014-06-16 09:36:28   19.1   |   
Thermomether01 2014-06-16 10:03:51   18.8   |   
Thermomether01 2014-06-16 10:31:14   19.2   |   
Thermomether01 2014-06-16 11:00:17   19.1   |   
Thermomether01 2014-06-16 11:27:38   19.2   |   
Thermomether01 2014-06-16 11:54:59   19.1   |   
Thermomether01 2014-06-16 12:51:24   18.5   |

等...

如此处所示,它没有显示所有值,也没有列出小时数。

----------编辑----------------------

select (CONCAT(`data_registo`, ' ', hora_registo)) as data,  temperatura, idSensor from registos where idSensor like 'Thermometer01' and temperatura not in ('---')  and data_registo between '2014-06-01' and '2014-06-10'

实现这一点并没有改变输出。

【问题讨论】:

    标签: java mysql swing jfreechart h2


    【解决方案1】:

    我怀疑您在将String 转换为Date 时会丢失精度。这个完整的示例在内存中创建了一个合适的数据库表,将其查询到 JDBCXYDataset 并在时间序列图中显示数据集。请注意,JDBCXYDataset 可识别时间序列数据。作为检查,查询 JDBCXYDataset 以获取返回的日期值。

    典型的每小时数据:

    … 2014 年 7 月 15 日下午 1:10:25 2014 年 7 月 15 日下午 2:10:25 2014 年 7 月 15 日下午 3:10:25 2014 年 7 月 15 日下午 4:10:25 2014 年 7 月 15 日下午 5:10:25 2014 年 7 月 15 日下午 6:10:25 …

    代码:

    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();
                }
            });
        }
    }
    

    【讨论】:

    • 感谢@trashgod 的回复。先生还有一个问题。为什么我什至限制图形中查询的结果显示一切都在数据库中?我编辑了我的问题以解释我的疑问。
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2017-10-08
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多