gpt4 book ai didi

java - JDBCCategoryDataset - 执行多个查询

转载 作者:行者123 更新时间:2023-12-01 15:35:58 28 4
gpt4 key购买 nike

我想使用 JDBCCategoryDataset 在 JFrame 内创建三个图表类。

我如何给出三个单独的查询?我在数据集对象中给出了三个不同的查询,但结果是显示三个相似的图表。此外,它还执行所有三个查询的最后一个查询。我已经看到了 DefaultPieDataset 的完成方式给定默认(静态)值,但我想从数据库动态检索数据。

我知道我可以创建多个 JDBCCategoryDataset 对象吗?有更好的办法吗?

package barchart;

import Extra.OpenFile;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.jdbc.JDBCCategoryDataset;
import org.jfree.ui.RefineryUtilities;

public class Chart {
public static void main(String[] args) throws IOException {

try {
JDBCCategoryDataset dataset = new JDBCCategoryDataset(
"jdbc:mysql://localhost:3306/jobfinder",
"com.mysql.jdbc.Driver","giannis", "giannis");

JFrame frame = new JFrame("Charts");
frame.setLayout(new GridLayout(2,1));

String query = "";
query = OpenFile.getContent("query"); //Gets the query from a file
// cause it's big.It's a custom class.
dataset.executeQuery(query);
JFreeChart chart =
ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity",
dataset, PlotOrientation.VERTICAL, true, true, false);

chart.setBackgroundPaint(Color.white);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setRangeGridlinePaint(Color.white);

BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setSeriesPaint(1, Color.CYAN);
renderer.setSeriesPaint(0, Color.DARK_GRAY);
renderer.setDrawBarOutline(false);
renderer.setItemMargin(0.0);

ChartPanel chartPanel = new ChartPanel(chart, false);
chartPanel.setPreferredSize(new Dimension(700, 270));

frame.add(chartPanel);


// query = "SELECT occuDscr Jobs,COUNT(pstOccuId) Quantity FROM occupation_field " +
// "INNER JOIN job_post ON occuId = pstOccuId GROUP BY Jobs";
// dataset.executeQuery(query);
// JFreeChart chart1 =
// ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity",
// dataset, PlotOrientation.VERTICAL, true, true, false);
//
// ChartPanel chartPanel1 = new ChartPanel(chart1, false);
// chartPanel.setPreferredSize(new Dimension(500/2, 270/2));
//
// frame.add(chartPanel1);
//
// query = "SELECT occuDscr Jobs,COUNT(usrOccuId) Quantity FROM occupation_field " +
// "INNER JOIN users ON occuId = usrOccuId GROUP BY Jobs";
// dataset.executeQuery(query);
// JFreeChart chart2 =
// ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity",
// dataset, PlotOrientation.VERTICAL, true, true, false);
//
// ChartPanel chartPanel2 = new ChartPanel(chart2, false);
// chartPanel.setPreferredSize(new Dimension(500/2, 270/2));
//
// frame.add(chartPanel2);

frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();

RefineryUtilities.centerFrameOnScreen(frame);

} catch (FileNotFoundException fe) {
System.out.println("Error Occurred " + fe.getMessage());
System.exit(0);
} catch (IOException ie) {
System.out.println("Error Occurred " + ie.getMessage());
System.exit(0);
} catch (ClassNotFoundException ce) {
System.out.println("Error Occurred " + ce.getMessage());
System.exit(0);
} catch (SQLException se) {
System.out.println("Error Occurred " + se.getMessage());
System.exit(0);
}
}
}

最佳答案

从概念上讲,最简单的方法是为每个面板提供其自己的特定查询 JDBCCategoryDataset 。在此相关example ,每个 ThermometerDemo 面板都有自己的 DefaultValueDataset

或者,定义一个具有单个 JDBCCategoryDataset 的类,该类检索组成三个 CategoryDataset 实例所需的所有数据,并公开每个返回所需的单独数据集的静态工厂方法对于每个饼图。

附录:后一种方法假设存在一些有用的启发式方法来区分完整结果集的子集。作为示例,以下是连续子集的部分实现:

/** @see https://stackoverflow.com/questions/8835974 */
public class MyCategoryDataset implements CategoryDataset{

private JDBCCategoryDataset set;
private List subList;

private MyCategoryDataset(JDBCCategoryDataset set, int first, int last) {
this.set = set;
subList = set.getRowKeys().subList(first, first);
}

public static CategoryDataset createSubset(
JDBCCategoryDataset set, int first, int last) {
return new MyCategoryDataset(set, first, first);
}

@Override
public Comparable getRowKey(int row) {
return (Comparable) subList.get(row);
}

@Override
public int getRowIndex(Comparable key) {
return subList.indexOf(key);
}

@Override
public List getRowKeys() {
return subList;
}

// TODO
//@Override
//public Comparable getColumnKey(int column) {}
//
//@Override
//public int getColumnIndex(Comparable key) {}
//
//@Override
//public List getColumnKeys() {}
//
//@Override
//public Number getValue(Comparable rowKey, Comparable columnKey) {}
//
//@Override
//public int getRowCount() {}
//
//@Override
//public int getColumnCount() {}
//
//@Override
//public Number getValue(int row, int column) {}
//
//@Override
//public void addChangeListener(DatasetChangeListener listener) {}
//
//@Override
//public void removeChangeListener(DatasetChangeListener listener) {}
//
//@Override
//public DatasetGroup getGroup() {}
//
//@Override
//public void setGroup(DatasetGroup group) {}
}

关于java - JDBCCategoryDataset - 执行多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com