2016-06-10 3 views
0

Моя цель - написать небольшую программу, которая попадает в нашу базу данных общественной безопасности и получает время отклика скорой помощи. Затем я хочу взять эти данные и создать гистограмму. У меня очень трудное время, когда JFreechart печатает гистограмму времени отклика скорой помощи. Когда я запускаю мой код Netbeans генерирует сообщение об ошибке:Jfreechart и jdbc.CategoryDataset

Исключение в потоке «основного» java.lang.ClassCastException: org.jfree.data.jdbc.JDBCCategoryDataset не может быть приведен к org.jfree.data.xy .IntervalXYDataset at EMSResearch.histogram1.main (histogram1.java:39) C: \ Users \ kulpandm \ AppData \ Local \ NetBeans \ Cache \ 8.1 \ executor-snippets \ run.xml: 53: Java возвращается: 1 BUILD FAILED (общее время: 7 секунд)

У меня нет абсолютно никакой идеи, как решить эту проблему. Если я смогу получить гистограмму для распечатки, я смогу продолжить работу и взломать ее, чтобы она выглядела хорошо для моих отчетов. Ниже приведен мой код:

package EMSResearch; 

import java.io.File; 
import java.io.IOException; 
import java.sql.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.jdbc.JDBCCategoryDataset; 
import org.jfree.data.xy.IntervalXYDataset; 

public class histogram1 
{ 

public static void main(String[] args) throws ClassNotFoundException 
{ 

    try 
    { 
     Connection conn = null; 
     conn = DriverManager.getConnection("jdbc:sqlserver://MyURL;database=MyDatabase;integratedsecurity=false;user=MyUser;password=MyPassword"); 
     //dataset = new JDBCCategoryDataset(conn); 
     String query = "SELECT PUN_UnitID\n" 
       + ", DATEDIFF(SECOND, IIU_tenroute, IIU_tArrive) AS [ResponseTime]\n" 
       + "FROM IIncidentUnitSummary\n" 
       + "WHERE IIU_tDispatch > 'may 15, 2016'\n" 
       + "AND PUN_UnitID LIKE 'M[0-4]_'\n" 
       + "AND IIU_tEnroute IS NOT NULL\n" 
       + "AND IIU_tArrive IS NOT NULL\n" 
       + "AND DATEDIFF(SECOND, IIU_tEnroute, IIU_tArrive) BETWEEN 0 AND 1800"; 
     JDBCCategoryDataset dataset = new JDBCCategoryDataset(conn, query); 
     dataset.executeQuery(query); 
     conn.close(); 
     //the following blows up. 
     JFreeChart chart; 
     chart = ChartFactory.createHistogram("data", "ws range", "freq", (IntervalXYDataset) dataset, PlotOrientation.VERTICAL, true, false, false); 
     int width = 560; 
     int height = 370; 
     File histChart = new File("c:\\histChart2.jpeg"); 

     try 
     { 
      ChartUtilities.saveChartAsJPEG(histChart, chart, width, height); 
     } catch (IOException ex) 
     { 
      Logger.getLogger(chart2.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } catch (SQLException ex) 
    { 
     ex.printStackTrace(); 
    } 

} 
} 

Не могли бы вы показать мне, что я делаю неправильно? Что я могу сделать, чтобы исправить это? (пожалуйста, будьте конкретны, так как я не эксперт-программист).

ответ

1

A CategoryDataset является не a IntervalXYDataset; они предоставляют клиентам совершенно разные вещи.

A CategoryDataset можно использовать для создания гистограммы. Вызов ChartFactory.createBarChart(), используя ваш JDBCCategoryDataset, должен хотя бы дать вам что-то посмотреть. См. Соответствующий раздел example.

API предлагает «написать собственный код для чтения данных с ResultSet». Я бы использовал данные для заполнения HistogramDataset, увиденного here. Потому что HistogramDataset реализует IntervalXYDataset, он подходит для использования с ChartFactory.createHistogram(). Где example имеет одну серию для каждого основного цвета, похоже, что вам может понадобиться одна серия для каждого PUN_UnitID.

Концептуально может быть проще SELECT DISTINCT PUN_UnitID, которые соответствуют вашему предложению LIKE в исходном запросе. Затем запросите значения response time для каждого PUN_UnitID и вызовите dataset.addSeries(PUN_UnitID, values, bins).

В качестве альтернативы, петля через ResultSet, добавление элементов к Map<String, List<Integer>>, где ключ является PUN_UnitID значение является List из response times. Используйте записи Map для построения HistogramDataset, как и раньше.

Если время ожидания становится проблемой, обновите набор данных с использованием SwingWorker, как показано на рисунке here.