【发布时间】:2013-08-23 23:59:47
【问题描述】:
问题已解决:解决方案正在更改为 JFreeChart v1.0.15
我有一个非常特殊的问题。
我设置的是一个文件,它向 Yahoo Finance 网站发送 url 请求,然后使用结果在 JFrame 中绘制 JFreeChart。
我无法理解的是以下内容:
对于某些 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 中显示的代码来自 this site(该代码由 RoyW » Sat May 10, 2008 7:52 am 发布。
- 传入的数据量似乎不是问题,因为在请求 1 中,数据点比请求 2 中的多
- 我下载数据的方式并不重要(我尝试直接从 url 读取,我尝试将
.csv文件保存到文件夹,然后从文件夹中读取) - 问题不是随机发生的:我尝试多次启动 JFrame(重新编译代码然后运行它),但“错误”的引用每次都会导致 JFrame 崩溃。
额外信息
可能与它有关的事情:
- 当我使用正确的报价启动图表并拖动图表时,会发生一些奇怪的事情。每隔一段时间,似乎每个周末,烛台都会变得越来越小,直到它们变成一条条纹。然后当我拖过周末时,它们又变厚了,直到它们恢复正常大小。这似乎每个周末都会发生。请参考以下图片:
所以这让我想到它可能与trading days 有关。但这也没有任何意义,因为 1/1/2011(请求 1)落在星期六,而 3/1/2012(请求 2)落在星期四,请求 1 成功,请求 2 失败。
我完全不知道我应该做什么。
非常感谢所有帮助。
更新
根据要求,这里是 SSCCE 和 trashgod 的建议(使用 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 解决了所有问题。感谢trashgod(在不知不觉中)通过广泛回答并提及使用的库版本解决了我的问题。
有人知道我可以如何帮助遇到同样问题的其他人吗?有什么地方可以记录这个错误吗?
【问题讨论】:
标签: java swing jfreechart yahoo-finance