[英]jfreechart crashes when using Yahoo Finance Quotes
我有一个非常特殊的问题。
我设置的是一个文件,该文件将url请求发送到Yahoo Finance网站,然后使用结果在JFrame中绘制JFreeChart。
我只是无法理解以下内容:
对于某些网址请求,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";
导致错误。
这怎么可能?
我知道以下几点:
.csv
文件保存到文件夹,然后从该文件夹读取) 可能与此有关:
所以我想,这可能与交易日有关 。 但是,这并没有任何意义或者是因为1/1/2011(请求1)适逢星期六,2012/3/1(请求2)正好是周四,而请求1是成功的,并要求2失败。
我对应该做什么绝对一无所知。
所有帮助,不胜感激。
根据要求,这是SSCCE,其中包含垃圾桶的建议(使用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<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
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可以解决所有问题。 废纸trash (在不知不觉中)通过广泛回答并提及所使用的库版本来解决我的问题, 对此表示感谢。
有谁知道我可以如何帮助遇到同样问题的其他人? 在某个地方可以找到该错误的门户吗?
CandlestickDemo
可用于jfreechart v1.0.15和您的任何一个查询。 我做了两个更改:
在事件分配线程上构造GUI; 否则,将导致数据争用,结果不确定:
EventQueue.invokeLater(new Runnable() { @Override public void run() { new CandlestickDemo("GOOG").setVisible(true); } });
忽略后备缓冲区,尽管可能无关紧要:
ChartPanel chartPanel = new ChartPanel(chart, false);
附录:作为参考,它看起来像是在r2692中应用了对ParamChecks.nullNotPermitted()
的调用,代替了显式检查,但渲染器在其他方面没有改变。
附录:在v1.0.14下,该示例可与DateAxis
的DefaultTimeline
DateAxis
正常使用,在此期间它发生了很大变化 。
附录:@David Gilbert指出,相关的更改可以在r2465中找到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.