2015-02-06 1 views
1

here과 비슷한 마우스와 함께 움직이는 Jfreechart Gantt Chart 위에 십자 표시를 추가하고 싶습니다. 불행하게도이 오류가 표시됩니다jfreechart : 간트 차트에 십자형 오버레이 추가

private Crosshair xCrosshair; 
private Crosshair yCrosshair; 

public void createChartPanel(JFreeChart chart){ 

    chartPanel = new ChartPanel(chart); 
    chartPanel.setInitialDelay(0); // make the tooltip appear quicker 

    // Mouse wheel listener for the zoom in out feature 
    chartPanel.addMouseWheelListener(this); 
    // Mouse movement listener for the cross hair feature 
    chartPanel.addChartMouseListener(this); 

    CrosshairOverlay crosshairOverlay = new CrosshairOverlay(); 
    this.xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f)); 
    this.xCrosshair.setLabelVisible(true); 
    this.yCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f)); 
    this.yCrosshair.setLabelVisible(true); 
    crosshairOverlay.addDomainCrosshair(xCrosshair); 
    crosshairOverlay.addRangeCrosshair(yCrosshair); 
    chartPanel.addOverlay(crosshairOverlay); 
} 

// add the custom renderer and modify x axis 
public void createCategoryPlot(JFreeChart chart){ 

    plot = chart.getCategoryPlot(); 
    ganttRenderer = new Renderer(); 
    plot.setRenderer(ganttRenderer); 

      /* Modify the x axis */ 
    DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ENGLISH); 
    format.applyPattern("#"); 

    xAxis = new NumberAxis(); 
    xAxis.setNumberFormatOverride(format); 
    xAxis.setLabel("Cycles"); 

    CategoryAxis axis = plot.getDomainAxis(); 
    axis.setLowerMargin(0.05); 
    axis.setCategoryMargin(0.55); 
    axis.setUpperMargin(0.05); // modify the position of each task axis 
    plot.setRangeAxis(xAxis); 

    // add change listener to for change in the axis range 
    plot.getRangeAxis().addChangeListener(this); 
    initRange = xAxis.getRange(); 
    chartPanel.getChart().removeLegend(); 
} 

public void chartMouseMoved(ChartMouseEvent event) {  

    int mouseX = event.getTrigger().getX(); 
    int mouseY = event.getTrigger().getY(); 


    Rectangle2D dataArea = this.chartPanel.getScreenDataArea(); 
    JFreeChart chart = event.getChart(); 

    double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, RectangleEdge.BOTTOM); 
    //  double y = DatasetUtilities.findYValue(plot.getDataset(), 0, x); 
    this.xCrosshair.setValue(x); 

    this.yCrosshair.setLabelGenerator(new CrosshairLabelGenerator(){ 

     @Override 
     public String generateLabel(Crosshair arg0) { 
      return "y value"; 
     } 

    });   
} 

, 나를 카테고리 플롯 위에 오버레이 할 수 없습니다 : 나는 내 자신을 만들어 그 예를 다음

.

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: org.jfree.chart.plot.CategoryPlot cannot be cast to org.jfree.chart.plot.XYPlot 
at org.jfree.chart.panel.CrosshairOverlay.paintOverlay(CrosshairOverlay.java:233) 
at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1658) 

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

+0

'CrosshairOverlay'는'CategoryPlot'이 아닌'XYPlot'을 기대합니다. – trashgod

+0

오류에서 알 수 있습니다. 하지만 '카테고리 플롯'에 십자형을 구현하려면 해결 방법이 필요합니다. – 2c00L

+0

아마도 '카테고리 마커'입니까? – trashgod

답변

1

ChartFactory.createGanttChart()here을 도시 한 바와 같이, 인스턴스 CategoryPlot하지만 CrosshairOverlayXYPlot 기대. 플롯의 기존 십자선 구현과 IntervalCategoryToolTipGenerator에 표시된 DEFAULT_TOOL_TIP_FORMAT_STRING에 기반한 맞춤 도구 팁 형식을 사용하면 비슷한 효과를 얻을 수 있습니다.

CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
plot.setDomainCrosshairVisible(true); 
plot.setRangeCrosshairVisible(true); 
GanttRenderer r = (GanttRenderer) plot.getRenderer(); 
r.setBaseToolTipGenerator(new IntervalCategoryToolTipGenerator(
    "{0}, {1}: {3} - {4}", DateFormat.getDateInstance())); 
관련 문제