2

質問は解決済み: ソリューションは JFreeChart v1.0.15 に変更されます


私は非常に独特な問題を抱えています。

私が設定したのは、url リクエストを Yahoo Finance Web サイトに送信し、その結果を使用して 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 May 10, 2008 7:52 am ) からのものです。
  • リクエスト 1 にはリクエスト 2 よりも多くのデータ ポイントがあるため、受信するデータの量は問題ではないようです。
  • .csvデータをダウンロードする方法は問題ではありません (URL から直接読み取る方法と、ファイルをフォルダーに保存してからフォルダーから読み取る方法の両方を試しました)
  • 問題がランダムに発生するわけではありません。JFrame の起動 (コードを再コンパイルしてから実行) を複数回試みましたが、「間違った」引用符が毎回 JFrame をクラッシュさせます。

追加情報

それと関係があるかもしれない何か:

  • 正しい引用符でグラフを起動し、グラフをドラッグすると、奇妙なことが起こります。一定の間隔で、毎週末、ろうそく足が小さくなり、縞だけになるようです。その後、週末にドラッグすると、通常のサイズに戻るまで再び厚くなります. これは毎週末に発生するようです。次の図を参照してください。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

それで、取引日と何か関係があるのではないかと考えさせられました。しかし、 2011 年 1 月 1 日(リクエスト 1) は土曜日に、2012年 3 月 1 日(リクエスト 2) は木曜日に、リクエスト 1 は成功し、リクエスト 2 は失敗したため、これは意味がありません。

私は何をすべきかについて全く無知です。

すべてのヘルプは大歓迎です。

アップデート

リクエストに応じて、trashgodの提案を含む 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 に変更すると、すべてが解決しました。広く回答し、使用されているライブラリのバージョンに言及することで、(無意識のうちに)私の問題を解決してくれたtrashgodに感謝します。

同じ問題を抱えている他の人を助ける方法を知っている人はいますか? このバグを記録できるポータルはありますか?

4

1 に答える 1

4

CandlestickDemojfreechart といずれかのクエリで動作します。私は2つの変更を加えました:

  • イベント ディスパッチ スレッドで GUI を構築します。そうしないと、非決定論的な結果を伴うデータ競合が発生します。

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new CandlestickDemo("GOOG").setVisible(true);
        }
    });
    
  • おそらく無関係ですが、バッキング バッファーを省略します。

    ChartPanel chartPanel = new ChartPanel(chart, false);
    
  • 補遺: 参考までに、への呼び出しがr2692ParamChecks.nullNotPermitted()適用され、明示的なチェックが置き換えられたように見えますが、レンダラーはそれ以外は変更されていません。

  • 補遺: v1.0.14 では、サンプルはDefaultTimelineofDateAxisで正しく動作しますが、その間に大幅に変更されました。

  • 補遺: @David Gilbert は、関連する変更がr2465にある可能性があると指摘しています。

画像

于 2013-08-24T02:30:36.490 に答える