jfreechart se bloquea cuando se utilizan las cotizaciones de Yahoo Finance

PREGUNTA RESUELTA: la solución está cambiando a JFreeChart v1.0.15

Tengo un problema muy peculiar.

Lo que he configurado es un archivo que envía una solicitud de URL al sitio web de Yahoo Finance y luego utiliza los resultados para dibujar un JFreeChart en un JFrame.

Lo que no puedo entender es lo siguiente:

Para ciertas solicitudes de url, el JFrame se bloquea

Comienza, pero solo muestra una pantalla blanca. Mientras que para otras solicitudes, mi programa funciona bien.

Ejemplo

Por ejemplo:

Esta petición:

"http://ichart.yahoo.com/table.csv?s=GOOG&a=0&b=1&c=2011&d=6&e=24&f=2013&g=d&ignore=.csv";

funciona bien.

Pero esta petición:

"http://ichart.yahoo.com/table.csv?s=GOOG&a=2&b=1&c=2012&d=6&e=24&f=2013&g=d&ignore=.csv";

causa un error

¿Cómo es esto posible?

Nota

Sé lo siguiente:

JFrame se bloquea pero JVM no lo nota (no se da cuenta de que se bloquea)La descarga de las cotizaciones de acciones (la información que utiliza JFreeChart) funciona perfectamente en ambos casosEl código para descargar los datos y mostrarlos en JFreeChart proviene deeste sitio (el código publicado porRoyW »Sáb 10 de mayo de 2008 7:52 am).La cantidad de datos que ingresan no parece ser un problema porque en la solicitud 1, hay más puntos de datos que en la solicitud 2La forma en que descargo los datos no importa (probé ambas lecturas directamente de la url y traté de guardar la.csv archivo a una carpeta y luego leer de la carpeta)El problema no se produce de forma aleatoria: he intentado lanzar el JFrame (volver a compilar el código y luego ejecutarlo) varias veces, pero la cita "incorrecta" bloquea el JFrame cada vez.Información extra

Algo que podría tener que ver con eso:

Cuando lanzo el gráfico con una cita correcta y arrastro el gráfico, sucede algo extraño. A un cierto intervalo, parece que cada fin de semana, las velas se hacen cada vez más pequeñas hasta que son solo una franja. Luego, cuando arrastro el fin de semana, se vuelven más gruesas hasta que vuelven a tener el tamaño normal. Esto parece suceder para cada fin de semana. Consulte las siguientes imágenes:

Así que me puse a pensar que podría tener algo que ver condías de negociación. Pero esto tampoco tiene sentido porque1/1/2011 (solicitud 1) cae en un sábado y3/1/2012 (la solicitud 2) cae en un jueves mientras que la solicitud 1 tuvo éxito y la solicitud 2 falló.

No tengo ni idea de lo que debo hacer.

Toda la ayuda muy apreciada.

Actualizar

A petición, aquí está elSSCCE contrashgodSugerencias de (usando 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);
                }
            });
        }
    }

Esto genera un JFrame que no muestra nada más que una pantalla en blanco. Intenta cambiar elstrUrl a

 "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";

y te darás cuenta de que funciona bien.

Actualizar

¡Resuelto! El problema era la versión JFreeChart. Cambiar de v1.0.14 a v1.0.15 solucionó todo. Felicitaciones atrashgod para (sin saberlo) resolver mi problema respondiendo ampliamentey mencionando la versión de la biblioteca. usado.

¿Alguien sabe cómo puedo ayudar a otros que tienen el mismo problema? ¿Hay algún portal en algún lugar donde pueda tomar nota de este error?

Respuestas a la pregunta(1)

Su respuesta a la pregunta