2010-07-22 2 views
7

내가 초기화 프로세스 메모리의 상태를 표시하는 JFreeChart의 인스턴스를 클릭 JFreeChart를 다음과 같이 마우스 얻기 데이터 소스 값은

m_data = new TimeSeriesCollection(); 
TimeSeries vmsize = new TimeSeries("VMSize"); 
TimeSeries resident = new TimeSeries("Resisdent"); 
TimeSeries shared = new TimeSeries("Shared memory"); 
TimeSeries code = new TimeSeries("Code"); 
TimeSeries data = new TimeSeries("Data"); 
m_data.addSeries(vmsize); 
m_data.addSeries(resident); 
m_data.addSeries(shared); 
m_data.addSeries(code); 
m_data.addSeries(data); 
JFreeChart chart = ChartFactory.createTimeSeriesChart("Memory usage", "Time", "Size", m_data, true, true, false); 
m_chart = new ChartPanel(chart); 

나중에 나는 TimeSeriesCollection의 각 시계열에 값을 추가 할 수 있습니다. 나는 어떻게 든 사용자가 차트를 클릭 할 때 콜럼과 관련된 시간, 또는 그보다 더 나은 - 값의 인덱스가 무엇인지를 알고 싶습니다.

나는 JFreeChart 클래스와 ChartMouseListener 클래스를 살펴 봤지만 어떻게해야하는지 알지 못했다. (또한 JFreeChart의 문서는 성가신만큼 희소하다. 사람들이 개발자 가이드를 사려고하는 것 같다). 이 같은 의해 마지막 두 줄을 교체하는 경우

답변

2

흠이 작동합니다 : 당신이 항목에 죽은 클릭하면

ChartPanel panel=new ChartPanel(ChartFactory.createTimeSeriesChart("Memory usage", "Time", "Size", m_data, true, true, false))); 
panel.addChartMouseListener(new ChartMouseListener(){ 
    void chartMouseClicked(ChartMouseEvent e){ 
     [...do something on click...] 
    } 
    void chartMouseMoved(ChartMouseEvent e){ 
     [...do something on move...] 
    } 
}); 
return panel; 
+0

음, 이미 ChartMouseLIstener를 살펴 봤는데, 이벤트의 정보는 거의 쓸모가 없습니다. 문제는 청취자를 추가하는 것이 아니라 이벤트에서 관련 데이터를 얻는 방법입니다. –

+0

ChartEvent.getEntity()를 사용하여 마우스 아래 모양 (막대, 선)을 가져올 수 있습니다. http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/entity/ChartEntity.html – fasseg

+0

+ 1, 챔피언처럼 작동! – trashgod

3

의 event.getEntity() 함수는 XYItem을 반환하고 거기에서 이후

XYItemEntity xyitem=(XYItemEntity) event.getEntity(); // get clicked entity 
XYDataset dataset = (XYDataset)xyitem.getDataset(); // get data set 
System.out.println(xyitem.getItem()+" item of "+xyitem.getSeriesIndex()+"series"); 
System.out.println(dataset.getXValue(xyitem.getSeriesIndex(), xyitem.getItem())); 
System.out.println(dataset.getYValue(xyitem.getSeriesIndex(), xyitem.getItem())); 
Comparable comparable=dataset.getSeriesKey(0); 
XYPlot xyplot = (XYPlot) event.getChart().getPlot(); 
System.out.println(xyplot.getRangeCrosshairValue()); 

그러나 항목 자체를 클릭하지 않고 십자형 커서가 데이터에 자동 잠김으로 설정된 경우 십자형 커서가 가장 가까운 항목으로 이동하지만 해당 항목이 클릭되지 않았기 때문에 사용자는 표시되지 않습니다. XYItem을 얻을 수 있으므로 시리즈 및 항목 인덱스를 알 수 없으므로, 이 문제를 해결하려면 아래 코드가 있습니다. 위의 코드는 try 절에 있어야합니다. 위의 코드는 try 절에 있어야합니다.

먼저 도메인과 범위에서 십자형 값을 취하는 함수를 정의하고 Xydataset을 지정합니다. 함수는 항목 인덱스 및 시리즈 인덱스를 그룹화하는 내부 클래스 객체를 반환합니다.

public static SeriesAndItemIndex getItemIndex(double domainVal,double rangeVal,XYDataset xydataset){ 
Comparable comparable; 
int indexOf; 
for(int i=0;i<xydataset.getSeriesCount();i++){ 

comparable = xydataset.getSeriesKey(i); 
    indexOf=xydataset.indexOf(comparable); 
for(int j=0 ; j<xydataset.getItemCount(indexOf);j++){ 

    double x=xydataset.getXValue(indexOf, j); 
    double y=xydataset.getYValue(indexOf, j); 

    if(x == domainVal && y==rangeVal){ 
     return new SeriesAndItemIndex(j,indexOf);//return item index and series index 
       } 


      } 
     } 
     return null; 
    } 

private static class SeriesAndItemIndex{ ///inner CLASS to group series and item clicked index 
     public int itemIndex; 
     public int seriesIndex; 
     public SeriesAndItemIndex(int i,int s){ 
      itemIndex=i; 
      seriesIndex=s; 
     } 

     @Override 
     public String toString(){ 
      return "itemIndex="+itemIndex+",seriesIndex="+seriesIndex; 
     } 
    } 

사용 방법은 무엇입니까?

try{......code block from the top 

}catch(Exception e){ 

Object source=event.getSource(); 
JFreeChart chartpanel=(JFreeChart)source; 
XYPlot xyplot = (XYPlot) chartpanel.getPlot(); 
XYDataset xydataset= xyplot.getDataset(); 
double d=xyplot.getDomainCrosshairValue(); //get crosshair X value 
double r =xyplot.getRangeCrosshairValue(); //get crosshair y value 
SeriesAndItemIndex index=getItemIndex(d,r,xydataset); 
if(index != null){ 
    System.out.println(index.toString()); 
} 
} 
+0

어떤 이벤트에 등록해야합니까? JFreeChart에 변경 리스너를 시도했지만 이벤트에 getEntity가 없습니다. –

+0

나는 ChartChangelistner를 그렇게 생각한다. – user482963