Java jfreechart在使用Yahoo Finance Quotes时崩溃 问题已解决:解决方案正在更改为JFreeChart v1.0.15

Java jfreechart在使用Yahoo Finance Quotes时崩溃 问题已解决:解决方案正在更改为JFreeChart v1.0.15,java,swing,jfreechart,yahoo-finance,Java,Swing,Jfreechart,Yahoo Finance,我有一个非常奇怪的问题 我设置的是一个文件,它向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&am

我有一个非常奇怪的问题

我设置的是一个文件,它向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中显示的代码来自RoyW?Sat 2008年5月10日上午7:52发布的代码。 传入的数据量似乎不是问题,因为在请求1中,数据点比请求2中的多 我下载数据的方式并不重要,我尝试了直接从url读取,并尝试将.csv文件保存到一个文件夹,然后从该文件夹读取 这个问题不是随机出现的:我尝试过启动JFrame重新编译代码,然后多次运行它,但每次“错误”的引用都会使JFrame崩溃。 额外信息 可能与此有关的内容:

当我用正确的引号启动图表并拖动图表时,奇怪的事情发生了。每隔一段时间,似乎每个周末,烛台都会变得越来越小,直到它们变成一条条纹。然后,当我拖过周末的时候,它们又变厚了,直到它们恢复正常大小。这似乎每个周末都会发生。请参阅以下图片:

所以这让我想到这可能与。但这也没有任何意义,因为2011年1月1日请求1落在周六,2012年3月1日请求2落在周四,而请求1成功,请求2失败

我完全不知道该做什么

非常感谢大家的帮助

使现代化 根据要求,以下是with使用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);
                }
            });
        }
    }
你会注意到它工作得很好

使现代化 解决了!问题是JFreeChart版本。从v1.0.14更改为v1.0.15解决了所有问题。感谢你在不知不觉中回答了我的问题,并提到了我使用的图书馆版本

有人知道我如何帮助其他有同样问题的人吗?是否有一个门户可以让我记录这个bug?

适用于我的v1.0.15版和您的任何一个查询。我做了两个改变:

在计算机上构建图形用户界面;否则会导致数据竞争,结果不确定:

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        new CandlestickDemo("GOOG").setVisible(true);
    }
});
省略备份缓冲区,尽管它可能与此无关:

ChartPanel chartPanel = new ChartPanel(chart, false);
附录:作为参考,它看起来像是对ParamChecks.NullNotAllowed的调用,替换了显式检查,但渲染器在其他方面没有更改

附录:在v1.0.14下,该示例可以正确使用的DefaultTimeline,它处于过渡阶段

增编:@David Gilbert指出,相关变化可在中找到

适用于v1.0.15和您的任何查询。我做了两个改变:

在计算机上构建图形用户界面;否则会导致数据竞争,结果不确定:

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        new CandlestickDemo("GOOG").setVisible(true);
    }
});
省略备份缓冲区,尽管它可能与此无关:

ChartPanel chartPanel = new ChartPanel(chart, false);
附录:作为参考,它看起来像是对ParamChecks.NullNotAllowed的调用,替换了显式检查,但渲染器在其他方面没有更改

附录:在v1.0.14下,该示例可以正确使用的DefaultTimeline,它处于过渡阶段

增编:@David Gilbert指出,相关变化可在中找到


更多信息为了更快地获得更好的帮助,请发布一个帖子。@AndrewThompson:请阅读我在备注部分的第三点。感谢you@nachokk:它因未显示任何内容而崩溃。而通常情况下,JFrame会显示几个JButton、JPanel等:现在它只显示一个白色屏幕。所以它启动了,但只显示了一个白色的“容器”。我希望你能明白。但是gui是冻结还是什么?可能是您正在阻止EDT,您使用的是SwingWorker吗?@AndrewThompson提出了一个令人信服的理由,但该论坛已经维持了十多年。更多信息要更快地获得更好的帮助,请发布一条。@AndrewThompson:请阅读备注部分中我的第三点。感谢you@nachokk:它因未显示任何内容而崩溃。而通常情况下,JFrame会显示几个JButton、JPanel等:现在它只显示一个白色屏幕。所以它启动了,但只显示了一个白色的“容器”。我希望你能明白。但是gui是冻结还是什么?也许你是
阻止EDT,你在使用SwingWorker吗?@AndrewThompson提出了一个令人信服的理由,但该论坛已经维持了十多年。你的建议不起作用;请看我的更新。我现在将把v1.0.14改为v1.0.15,看看是否有什么不同。库版本确实解决了这个问题。非常感谢您的精确性、详细性和快速响应!太棒了@让·保罗:很高兴你把它整理好了;可悲的是,我看不出有什么变化可以解释你的观察结果;更上面,奇怪。我仔细检查了一遍,我100%确定这与库从v1.0.14到v1.0.15的变化有关。所以无论如何,它一定有效果。我不得不同意。感谢您的链接。您的建议无效;请看我的更新。我现在将把v1.0.14改为v1.0.15,看看是否有什么不同。库版本确实解决了这个问题。非常感谢您的精确性、详细性和快速响应!太棒了@让·保罗:很高兴你把它整理好了;可悲的是,我看不出有什么变化可以解释你的观察结果;更上面,奇怪。我仔细检查了一遍,我100%确定这与库从v1.0.14到v1.0.15的变化有关。所以无论如何,它一定有效果。我不得不同意。谢谢你的链接。