1

ズームインおよびズームアウト中に一定数のビンを維持するJFreeChartヒストグラムを作成したいと思います。たとえば、ズームアウトすると12年が表示され、毎年1つのビンが表示されます。もう少しズームインすると、12か月が表示され、月ごとにビンが表示される場合があります。さらにズームインすると、1日1時間ごとに1つのビンがある可能性があります。これらは、それほどクリーンなビンサイズである必要はありませんが、アイデアは得られます。

HistogramDataset.addSeriesを使用して、データをヒストグラムに追加しています。パラメータは、セット全体のビンのbins数であり、ズームは考慮されていません。

ChartPanelを使用して、そのズーム方法をオーバーライドできることを確認しました。ここでは、ビンの数を変更できる可能性があります。ただし、ビンの数をどこで変更できるのか、何に変更する必要があるのか​​を理解するのに苦労しています。

編集:

この問題には、解決に不可欠であると私が信じているいくつかの部分があります。

  1. ユーザーがズームしたことをどのように伝えるのが最善か。私の現在のアプローチは、をオーバーライドすることzoomです。
  2. ユーザーがズームした境界を判別する方法。私はまだこれを行う方法がわかりません。
  3. ズームが表示されたビンの数と同じ数を維持するように、データモデルのビンの数を変更する方法。

ある文脈では、私の最終目標は、 Google Financeスタイルのコントロールを作成することです。Java用のGoogleFinanceスタイルのコントロールですか?

4

2 に答える 2

2

ズーム機能のオーバーロードは魅力的ですが、おそらく混乱を招きます。別の方法として、このに示すように、データモデルを更新するコントロールを追加することを検討してください。ここに示すように、のインスタンスは、enumを設定するのに特に便利です。JComboBox

于 2012-05-16T18:40:20.480 に答える
1

上記の私の個々の質問に答えるには:

  1. ChartPanelクラスのズームをオーバーライドし続けました。
  2. ユーザーがズームした範囲を決定するために、ズーム関数にはウィンドウ座標が与えられているため、以下の関数windowToRatioと関数を使用しました。ratioToModel
  3. ビンの数を変更するために、実際にはビンの数を同じに保ち、チャートに渡されるデータセットを変更するだけでした。SortedMapsubMapを簡単に取得できるデータモデルにを使用しました。

関数:

private double windowToRatio(double window) {
    Rectangle2D scaledDataArea = getScreenDataArea();
    return (window - scaledDataArea.getMinX()) / scaledDataArea.getWidth();
}

private double ratioToModel(double ratio) {
    Range domainRange = getChart().getXYPlot().getDomainAxis().getRange();
    return domainRange.getLowerBound() + ratio * domainRange.getLength();
}
于 2012-06-13T16:54:46.633 に答える