加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从Mysql DB填充JFreechart TimeSeriesCollection?

发布时间:2020-12-15 07:37:02 所属栏目:Java 来源:网络整理
导读:我正在尝试在我的应用程序中创建一个图表,它会返回几个月内的温度. 此图表是JFreechart TimeSeriesCollection,我无法让图表从数据库中读取正确的数据. 它显示了一些值,但不是全部,并且没有显示正确的时间. 为了解决这个问题,我尝试将图表实现为here发布,但仍
我正在尝试在我的应用程序中创建一个图表,它会返回几个月内的温度.

此图表是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`,idSensor from registos where idSensor like 'Thermometer01' and temperatura not in ('---')  and data_registo between '2014-06-01' and '2014-06-10'

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

解决方法

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

典型的每小时数据:

…
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
…

码:

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 https://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,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();
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读