7

JFreeChart を使用して XY プロットを作成しています。マウスと一緒に移動し、マウスの x 値に最も近いデータ ポイントを強調表示する十字線を実行する機能のリクエストがあります。Google Finance で同様の例を見ることができます - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC

これらの Google チャートは、現在の値のみを強調表示します (これを行い、十字線も表示します) が、探しているライブのマウス インタラクションを示しています。

誰にもエレガントな提案はありますか?

ありがとう。

4

4 に答える 4

5

マウスリスナーと CrosshairOverlay クラスを使用して、これを機能させました。休暇旅行から戻ったら、コードを投稿します。さほど難しくなく仕上がりました。


すみません、これを忘れていました!

まず、十字線を配置する場所の x、y 値を計算します。私にとっては、線の点に沿って移動させたかったので、最も近い x 値を計算し、そのデータ ペアを x、y に使用しました。

次に、このメソッドを呼び出します。

protected void setCrosshairLocation(double x, Double y) {
    Crosshair domainCrosshair;
    List domainCrosshairs = crosshairOverlay.getDomainCrosshairs();
    if (domainCrosshairs.isEmpty()) {
        domainCrosshair = new Crosshair();
        domainCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0);
        crosshairOverlay.addDomainCrosshair(domainCrosshair);
    }
    else {
        // We only have one at a time
        domainCrosshair = (Crosshair) domainCrosshairs.get(0);
    }
    domainCrosshair.setValue(x);

    if (y != null) {
        Crosshair rangeCrosshair;
        List rangeCrosshairs = crosshairOverlay.getRangeCrosshairs();
        if (rangeCrosshairs.isEmpty()) {
            rangeCrosshair = new Crosshair();
            rangeCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0);
            crosshairOverlay.addRangeCrosshair(rangeCrosshair);
        }
        else {
            // We only have one at a time
            rangeCrosshair = (Crosshair) rangeCrosshairs.get(0);
        }

        rangeCrosshair.setValue(y);
    }
}

crosshairOverlay は CrosshairOverlay のインスタンスであることに注意してください。

于 2009-12-20T04:12:52.970 に答える
1

JFreeChart はチャートのサブセクションをレンダリングできないため、チャートの再描画を必要としない何かを行う必要があります。グラフを BufferedImage に書き込んでメモリに保存し、バッファリングされたグラフを背景画像として使用し、その上に十字線やその他のポップアップ ウィンドウを描画するカスタム コンポーネントを作成できます。

JFreeChart には、レンダリングされたチャート上の特定の座標のデータ ポイントを取得するためのメソッドがあります。これらが私の頭の上にあるものを思い出さないでください。必要に応じて、独自のグラフ データのレンダリングを検討することもできますが、思ったほど難しくはありません。

于 2009-12-14T18:47:15.863 に答える
0

これは私にとってはうまくいきました。私は

chartPanel.addChartMouseListener(new ChartMouseListener() {
public void chartMouseMoved(ChartMouseEvent event)
    {
    try
    {
        double[] values = getCrossHairValue(event);

        plot.clearRangeMarkers();
        plot.clearDomainMarkers();

        Marker yMarker = new ValueMarker(values[1]);
        yMarker.setPaint(Color.darkGray);
        plot.addRangeMarker(yMarker);

        Marker xMarker = new ValueMarker(values[0]);
        xMarker.setPaint(Color.darkGray);
        plot.addDomainMarker(xMarker);

        chartPanel.repaint();
    } catch (Exception e)
    {

    }
    }

}

于 2012-02-02T14:31:47.700 に答える
0

最初に頭に浮かぶのは、カスタムCursorを作成してチャートに設定することです。チャートへの参照を持ち、カーソルの x/y 位置と一致する x 値を強調表示できます。

于 2009-12-14T18:05:09.257 に答える