2012-09-27 4 views
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 

    } 

} 

을하지만,이 마우스 청취자는 나에게 내 패널 좌표를 반환하고 난에서 좌표를 얻으려면 내 차트. 다른 객체와 함께 리스너를 사용해야합니까? 또는 어떤 방법으로 좌표를 변환 할 수 있습니까?

+0

_add_ 새로운 점을 원하거나 _select_ 기존 점을 원하십니까? 현재 접근 방식을 보여주는 [sscce] (http://sscce.org/)를 포함하도록 질문을 편집하십시오. – trashgod

답변

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 

패널이 차트 구성 요소의 컨테이너 인 경우 솔루션은 위와 같은 모양을 보일 수 있습니다. 이 좌표는 차트의 왼쪽 상단 구석에 대한 좌표입니다.

+1

조금 부서지기 쉽지 않습니까? 신뢰할 수있는 지오메트리를 얻으려면 렌더러 내부에서 작업해야 할 것 같습니다. – trashgod

+0

취성은 무엇입니까? 어떤 시점에서 충돌이 발생할 수 있다고 생각합니까? 렌더러는 리스너에서 chartMouseClicked() 함수를 의미합니까? (http : //docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html)? 나는 x와 y의 선언을 생략했다. 왜냐하면 나는 그것을 마우스 클릭 함수 안에 포함하기를 권장하지 않았기 때문이 아니라, 그 변수들의 소스를 주목하기 위해서였다. – user1581900

+0

렌더러가 화면과 모델 좌표간에 변환하기 위해 축을 사용할 수있는 반면, 차트 상대 좌표가 변경 될 수 있다는 의미에서 나는 취성을 의미했습니다. – trashgod

2

X를 가져 오기는 y는

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

하나의 주요 문제를 통해 그래프 공간 좌표 : 나는 JFreeChart가 내 ChartMouseEvent 핸들러가 호출 후 때까지이 값을 업데이트하지 않는 것을 발견; 매번 이전 값을 얻습니다. XYPlot.handleClick (x, y, info)에서 처리기의 현재 값을 가져 오는 데 대한 자세한 내용을 볼 수 있습니다.

1

ChartPanel에 대한 참조를 얻어야하고, 그 후에 만 ​​Plot에서 정확한 X, Y 좌표를 얻을 수 있습니다. 이렇게하려면 awt 대기열에 좌표 검색을 배치하고 직접 호출하지 않아야합니다. 아래 예제는 나를 위해 일한 예입니다 (X 좌표 만 해당)

@Override 
public void chartMouseClicked(ChartMouseEvent cme) { 
    final ChartMouseEvent cmeLocal = cme; 
    ChartPanel hostChartPanel = (ChartPanel) cme.getTrigger().getComponent(); 
    if (null != hostChartPanel) { 

     //Crosshair values are not valid until after the chart has been updated 
     //that is why call repaint() now and post Crosshair value retrieval on the 
     //awt thread queue to get them when repaint() is finished 
     hostChartPanel.repaint(); 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFreeChart chart = cmeLocal.getChart(); 
       XYPlot plot = chart.getXYPlot(); 
       double crossHairX = plot.getDomainCrosshairValue(); 
       JOptionPane.showMessageDialog(null, Double.toString(crossHairX), "X-Value", JOptionPane.OK_OPTION); 
      } 
     }); 
    } 
} 
관련 문제