Сбой jfreechart при использовании Yahoo Finance Quotes
У меня очень специфическая проблема.
Я настроил файл, который отправляет URL-запрос на веб-сайт Yahoo Finance, а затем использует результаты для рисования JFreeChart в JFrame.
Что я только могуу меня в голове есть следующее:
Для определенных URL-запросов происходит сбой JFrame
Запускается, но показывает только белый экран. В то время как для других запросов, моя программа работает нормально.
примерНапример:
Этот запрос:
"http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";
работает отлично.
Но эта просьба:
"http://ichart.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";
вызывает ошибку.
Как это возможно?
ЗаметкаЯ знаю следующее:
JFrame падает, но JVM нене обращать на это внимание (нене замечаю, что он вылетает)Загрузка котировок акций (информация, которую использует JFreeChart) проходит идеально в обоих случаяхКод для загрузки данных и их отображения в JFreeChart взят изэтот сайт (код, опубликованныйRoyW » Сб 10 мая 2008 7:52).Количество данных, поступающих в неЭто кажется проблемой, потому что в запросе 1 больше точек данных, чем в запросе 2То, как я загружаю данные, нене имеет значения (я пробовал оба чтения прямо из URL, и я пытался сохранить.csv
файл в папку и затем чтение из папки)Проблема неможет произойти случайно: ямы пытались запустить JFrame (перекомпилировать код, а затем запустить его) несколько раз, но 'неправильно' цитата сбивает JFrame каждый раз.Дополнительная информацияЧто-то, что может быть связано с этим:
Когда я запускаю график с правильной цитатой и перетаскиваю график, происходит что-то странное. С определенным интервалом, кажется, каждые выходные, свечи становятся все меньше и меньше, пока они не являются только полосой. Затем, когда я тащусь через выходные, они снова становятся более толстыми, пока они снова не приобретут нормальный размер. Кажется, это происходит каждые выходные. Обратитесь к следующим изображениям:
Так что я подумал, что это может быть как-то связано сторговые дни, Но это нене имеет никакого смысла либо потому, что1/1/2011 (запрос 1) выпадает на субботу и3/1/2012 (запрос 2) выпадает на четверг, когда запрос 1 был успешным, а запрос 2 - неудачным.
Я абсолютно не знаю, что мне делать.
Вся помощь высоко ценится.
ОбновитьПо запросу, вотSSCCE сtrashgod»s предложения (используя JFreechart lib v1.0.14).
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.CandlestickRenderer;
import org.jfree.data.xy.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.text.*;
import java.util.*;
import java.util.List;
public class CandlestickDemo2 extends JFrame {
public CandlestickDemo2(String stockSymbol) {
super("CandlestickDemo");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DateAxis domainAxis = new DateAxis("Date");
NumberAxis rangeAxis = new NumberAxis("Price");
CandlestickRenderer renderer = new CandlestickRenderer();
XYDataset dataset = getDataSet(stockSymbol);
XYPlot mainPlot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);
//Do some setting up, see the API Doc
renderer.setSeriesPaint(0, Color.BLACK);
renderer.setDrawVolume(false);
rangeAxis.setAutoRangeIncludesZero(false);
domainAxis.setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );
//Now create the chart and chart panel
JFreeChart chart = new JFreeChart(stockSymbol, null, mainPlot, false);
ChartPanel chartPanel = new ChartPanel(chart, false);
chartPanel.setPreferredSize(new Dimension(600, 300));
this.add(chartPanel);
this.pack();
}
protected AbstractXYDataset getDataSet(String stockSymbol) {
//This is the dataset we are going to create
DefaultOHLCDataset result = null;
//This is the data needed for the dataset
OHLCDataItem[] data;
//This is where we go get the data, replace with your own data source
data = getData(stockSymbol);
//Create a dataset, an Open, High, Low, Close dataset
result = new DefaultOHLCDataset(stockSymbol, data);
return result;
}
//This method uses yahoo finance to get the OHLC data
protected OHLCDataItem[] getData(String stockSymbol) {
List dataItems = new ArrayList();
try {
String strUrl= "http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";
URL url = new URL(strUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
DateFormat df = new SimpleDateFormat("y-M-d");
String inputLine;
in.readLine();
while ((inputLine = in.readLine()) != null) {
StringTokenizer st = new StringTokenizer(inputLine, ",");
Date date = df.parse( st.nextToken() );
double open = Double.parseDouble( st.nextToken() );
double high = Double.parseDouble( st.nextToken() );
double low = Double.parseDouble( st.nextToken() );
double close = Double.parseDouble( st.nextToken() );
double volume = Double.parseDouble( st.nextToken() );
double adjClose = Double.parseDouble( st.nextToken() );
OHLCDataItem item = new OHLCDataItem(date, open, high, low, close, volume);
dataItems.add(item);
}
in.close();
}
catch (Exception e) {
e.printStackTrace();
}
//Data from Yahoo is from newest to oldest. Reverse so it is oldest to newest
Collections.reverse(dataItems);
//Convert the list into an array
OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);
return data;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CandlestickDemo2("GOOG").setVisible(true);
}
});
}
}
Это создает JFrame, который отображает только белый экран. Попробуйте изменитьstrUrl
в
"http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";
и вы заметите, что он работает нормально.
ОбновитьРешил это! Проблема была в версии JFreeChart. Переход с v1.0.14 на v1.0.15 решил все. Слава кtrashgod за (неосознанно) решение моей проблемы путем широкого ответаи упоминание версии библиотеки используемый.
Кто-нибудь знает, как я могу помочь другим, у которых есть такая же проблема? Есть ли где-нибудь портал, где я могу отметить эту ошибку? "