ví dụ được trích dẫn
sử dụng JDBCXYDataset
cũng hoạt động với JDBCCategoryDataset
, như được hiển thị bên dưới và trong câu hỏi
ban đầu của bạn . Sử dụng JDBCCategoryDataset
, "Cột đầu tiên sẽ là tên danh mục và [các] cột còn lại [sẽ là] giá trị (mỗi cột đại diện cho một chuỗi);" sử dụng JDBCXYDataset
, "Cột đầu tiên sẽ là trục x và các cột còn lại là giá trị trục y." Do đó, tôi mong rằng truy vấn của bạn sẽ giống như sau:
SELECT Date_Time, PV …
Vì trục miền của bạn là thời gian, hãy xem xét xoay các vị trí nhãn, như được hiển thị tại đây
. Khi quyết định, hãy lưu ý rằng TimeSeries
kém linh hoạt hơn về hướng nhưng linh hoạt hơn về định dạng.
Các thay đổi sau đây đối với ví dụ
minh họa bằng cách sử dụng các giá trị dấu chấm động. Lưu ý rằng PV
thuộc loại float
và PreparedStatement
sử dụng 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;
}