繁体   English   中英

使用Yahoo Finance Quotes时jfreechart崩溃

[英]jfreechart crashes when using Yahoo Finance Quotes


解决的问题:解决方案正在更改为JFreeChart v1.0.15


我有一个非常特殊的问题。

我设置的是一个文件,该文件将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";

导致错误。

这怎么可能?

注意

我知道以下几点:

  • JFrame崩溃了,但是JVM没有记下它(没有注意到它崩溃了)
  • 在两种情况下,股票报价(JFreeChart使用的信息)的下载都很完美
  • 下载数据并将其显示在JFreeChart中的代码来自此站点RoyW»Sat May 10,2008 7:52 am张贴的代码)。
  • 传入的数据量似乎没有问题,因为请求1中的数据点比请求2中的数据点多
  • 我下载数据的方式无关紧要(我既尝试直接从url读取,又尝试将.csv文件保存到文件夹,然后从该文件夹读取)
  • 该问题不会随机发生:我曾尝试多次启动JFrame(重新编译代码,然后运行它),但是“错误”的引用每次都会使JFrame崩溃。

额外的信息

可能与此有关:

  • 当我用正确的引号启动图形并拖动图形时,会发生一些奇怪的事情。 在某个时间间隔,似乎每个周末,烛台变得越来越小,直到它们只是一条条纹。 然后,当我拖过整个周末时,它们再次变厚,直到再次恢复正常大小。 这似乎在每个周末都会发生。 请参考以下图片:

在此处输入图片说明在此处输入图片说明在此处输入图片说明

所以我想,这可能与交易日有关 但是,这并没有任何意义或者是因为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可用于 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下,该示例可与DateAxisDefaultTimeline DateAxis正常使用,在此期间它发生了很大变化

  • 附录:@David Gilbert指出,相关的更改可以在r2465中找到。

图片

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM