【问题标题】:JFreechart chart with Time from SQL Database来自 SQL 数据库的带有时间的 JFreechart 图表
【发布时间】:2021-01-03 03:54:45
【问题描述】:

我是 JFreeChart 的新手,我正在尝试创建一个在 y 轴上显示值并在 x 轴上显示时间的图表。 所有这些数据(值和时间)已经在我的数据库中,我每 3 到 4 秒就有一个值。

但是我不想显示所有内容或动态。例如,我只想显示一个图表,显示从 2020-06-16 10:31:52 到 2020-06-29 11:31:52 的所有值(但正如我所说,一切都已经在我的数据库中了)。

这是我的变体(没有所有导入):

public class JDBCTest {

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

    private JDBCXYDataset createDataset() {
        try {
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:","", "");
           
            Statement st = conn.createStatement();
            st.execute("DROP TABLE IF EXISTS Test ");
            st.execute("create table Test(Date_Heure timestamp, PV float)");
            
            String Date_Debut = "2020-06-25 13:28:08";
            String Date_Fin = "2020-06-26 13:28:08";
            String sql1 = "INSERT INTO Test (Date_Heure,PV) "
                    + "SELECT TABLE ,TABLE "
                    + "FROM TABLE "
                    + "WHERE Date_Heure BETWEEN ? AND ?";
            
            PreparedStatement ps = conn.prepareStatement(sql1);
           
            ps.setString(1,Date_Debut);
            ps.setString(2,Date_Fin);
            ps.executeUpdate();
            
            JDBCXYDataset jds = new JDBCXYDataset(conn);
            jds.executeQuery("select TABLE , TABLE from Test");
            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();
            }
        });
    }
}

编辑:错误来自数据库而不是代码本身。


编辑: 代码灵感来自于垃圾神http://stackoverflow.com/a/24762078/230513

附加信息:

Date_Time 类型的timestamp

PV 类型的float

【问题讨论】:

    标签: java mysql charts jfreechart


    【解决方案1】:

    使用JDBCXYDatasetexample cited 也适用于JDBCCategoryDataset,如下所示和您原来的question。使用JDBCCategoryDataset,“第一列将是类别名称,[the] 其余列 [将] 值(每列代表一个系列);”使用JDBCXYDataset,“第一列将是 x 轴,其余列是 y 轴值。”因此,我希望您的查询是这样的:

    SELECT Date_Time, PV …
    

    由于您的域轴是时间,请考虑旋转标签位置,如 here 所示。在决定时,请注意 TimeSeries 在方向方面不太灵活,但在格式方面更灵活。

    我数据库中的值是Float

    example 的以下更改说明了使用浮点值。注意PVfloat 类型,PreparedStatement 使用setFloat()

    JDBCCategoryDataset jds = createDataset();
    JFreeChart chart = ChartFactory.createLineChart("Test", "Time", "PV",
        jds,PlotOrientation.VERTICAL, true, true, false);
    CategoryPlot plot = (CategoryPlot) chart.getPlot();
    CategoryAxis domain = plot.getDomainAxis();
    plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);
    …
    private JDBCCategoryDataset createDataset() {
        try {
            Connection conn = DriverManager.getConnection(
                "jdbc:h2:mem:test", "", "");
            Statement st = conn.createStatement();
            st.execute("create table data(when timestamp, pv float)");
            PreparedStatement ps = conn.prepareStatement(
                "insert into data values (?, ?)");
            Calendar c = Calendar.getInstance();
            for (int i = 0; i < N; i++) {
                ps.setTimestamp(1, new Timestamp(c.getTimeInMillis()));
                ps.setFloat(2, (float)r.nextGaussian() + 2);
                ps.execute();
                c.add(Calendar.SECOND, r.nextInt(60 * 60));
            }
            JDBCCategoryDataset jds = new JDBCCategoryDataset(conn);
            jds.executeQuery("select when, pv from data");
            return jds;
        } catch (SQLException ex) {
            ex.printStackTrace(System.err);
        }
        return null;
    }
    

    【讨论】:

    • 我最大的问题之一是我的数据库中的值是Float 并在我的数据库中表示如下:![2.png](postimg.cc/rRJVzB57) 但我不知道如何使用他们喜欢你的例子,因为每次我尝试它们都会转换为int(我想)所以当我尝试显示图表时,值就会偏离......
    • @Nemrod:我已经更新了答案;而不是图像,请编辑您的问题以显示 PV 属性的类型。
    • 非常感谢@trashgod,你的例子很棒,但我得到了随机值,我该如何使用和显示我数据库中已有的值而不是生成随机值?
    • 我还编辑了我的问题,使其更加实际,并且在我的新问题中,请查看它,这可能更容易理解:)
    • 看起来使用正确的选择顺序并切换到JDBCXYDataset 可以解决您的JFreeChart 问题。您的数据中的异常可能需要一个新问题,但您可以尝试使用ORDER BY 子句来查看您是否有重复的时间戳..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多