5

マウスクリックでアプリにドットを設定したい。私は JFreeChart を使用し、ChartPanel マウス リスナーで使用します。これは次のようになります。

panel.addChartMouseListener(new ThisMouseListener());

そして私のマウスリスナー ThisMouseListener() (それは終わっていません):

class ThisMouseListener implements ChartMouseListener{

    @Override
    public void chartMouseClicked(ChartMouseEvent event) {
        int x = event.getTrigger().getX();
        int y = event.getTrigger().getY();

        System.out.println("X :" + x + " Y : " + y);

        ChartEntity entity = event.getEntity();
        if(entity != null && (entity instanceof XYItemEntity)){
            XYItemEntity item = (XYItemEntity)entity;
        }
        new JOptionPane().showMessageDialog(null, "Hello", "Mouse Clicked event", JOptionPane.OK_OPTION);
    }

    @Override
    public void chartMouseMoved(ChartMouseEvent arg0) {
        // TODO Auto-generated method stub

    }

} 

しかし、このマウスリスナーはパネル座標を返し、チャートから座標を取得したいと考えています。他のオブジェクトでリスナーを使用する必要がありますか? または、何らかの方法で座標を変換できますか?

4

3 に答える 3

3

リスナーをパネルに追加しました。したがって、マウスをクリックすると、イベントのソースであるパネルに対する座標を受け取ります。代わりに、このリスナーをチャートに追加する必要があります。

他の可能性は、パネルに関してチャートの座標を取得し、それらを x と y から差し引くことです。

Point p = chart.getLocation();     
int px = p.getX();
int py = p.getY();

x = x-px; // x from event
y = y-py; // y from event
// x and y are now coordinates in respect to the chart

if(x<0 || y<0 || x>chart.getWidth() || y>chart.getHeight()) // the click was outside of the chart
else // the click happened within boundaries of the chart and 

パネルがチャート コンポーネントのコンテナーである場合、ソリューションは上記のようになります。これらの座標は、チャートの左上隅を基準とした座標になることに注意してください。

于 2012-09-27T17:04:06.257 に答える
2

経由でグラフ空間の x、y 座標を取得します

double x = event.getChart().getXYPlot().getDomainCrosshairValue();
double y = event.getChart().getXYPlot().getRangeCrosshairValue();

1 つの大きな問題: JFreeChart は、 ChartMouseEvent ハンドラーが呼び出されるまでこれらの値を更新しないことがわかりました。毎回、以前の値を取得します。詳細については、XYPlot.handleClick(x,y,info) を参照して、ハンドラーで現在の値を取得できます。

于 2013-02-13T17:52:55.070 に答える