2012-04-27 2 views
1

JFree 차트의 일부 범례에 줄 바꿈을 추가해야합니다. 전설이 316 자이고 매 80자를 깨야합니다. 마지막으로 4 줄을 갖습니다.줄 바꿈이있는 JFree 차트 범례

어쨌든 "\ n", "\ u2424"및 " "으로 시도했습니다. 그것은 아무것도하지 않았다. (http://www.jfree.org/forum/viewtopic.php?f=3&t=10226 & http://www.jfree.org/forum/viewtopic.php?f=3&t=22417에서)

는 같은 휴식한다 그래서 나는 (내가 동적으로 수행 할 수 싶어하기 때문에하지만, 그것은 피할 수 바랬다) 찾을 수있는 유일한 해결책은 각 전설의 폭을 수정하는 것입니다 나는해야한다. 편집 : 심지어 작동하지 않았습니다.

내가 작은 전설, 당분간 jFree 차트 0.9.20


편집

을 사용하고, 즉 내가 가진 무엇 : good

그것은 괜찮아요하지만 내 전설이 오래있을 때 : problem :'(

마지막 사진은 내 전설을 기록하고 휴식 줄은 여기에 있지만 jFree 차트에는 나타나지 않습니다.

+0

이 난 그것은 작동하지 않았다 :(... 고정 폭을 시도 – Shikiryu

+0

크로스 게시 [여기] (http://www.jfree.org/forum/viewtopic. php? f = 3 & t = 110281 & sid = f2edbbdb7ab0df5b40feea73081da10e) – trashgod

답변

1

좋아요, 제 고객이 원했던대로 작동 시켰습니다.

먼저 새 종류의 Legend을 만들어야합니다 (예 : MyLegend).하지만 제발 현실 세계에서와 같은 이름을 지정하지 마십시오.

해당 클래스는 Legend을 확장해야하며 Serializable을 구현해야합니다 (StandardLegend과 동일).

StandardLegendMyLegend에 복사/붙여 넣기도했습니다. 그런 다음 표준 범례를 사용자 정의로 수정할 수 있습니다. 내 요구를 들어

, 나는 변경 :

  • draw()을 전설의 라벨을 분리하고 모든 라인 또 다른 아래 하나를 그릴 높이와 전체 전설의 그룹
  • drawSeriesElements()의 폭을 계산.
    • createDrawableLegendItem()
      // Multi line management for Legend 
      String[] multiline = item.getItem().getLabel().split(System.getProperty("line.separator")); 
      for(int j = 0; j<multiline.length; j++) { 
          RefineryUtilities.drawAlignedString(multiline[j], g2, 
           (float) item.getLabelPosition().getX(), (float) item 
           .getLabelPosition().getY() + g2.getFontMetrics().getHeight()*j, TextAnchor.CENTER_LEFT); 
      } 
      

    는 각 폭과 높이를 산출한다. 범례는 여러 줄이므로 한 항목의 각 줄은 다른 줄과 동일한 너비를 갖지 않습니다. 아이템의 실제 너비를 정의하는 데 가장 긴 것을 찾아야합니다. 같은 높이입니다. 이제는 여러 줄이므로 항목의 실제 높이를 알 수있는 선의 수를 계산해야합니다.

선택적으로 을 변경하여 여러 줄로 만들 수도 있습니다.

해당 클래스가 원하는대로 구성되면 차트에 적용해야합니다.

그래서, 당신은 평소와 같이 수행예요

JFreeChart chart = new JFreeChart(...); 
chart.set ... // apply your series and options 

MyLegend legend = new MyLegend(); 
legend.set... // apply your legend options if applicable 
chart.setLegend(legend); 

합니다.

결과 :

Final Result

3

두 가지 대안을 고려해야 할 축약 범례 표시 문자열을 감안할 때,

  • 사용 setLegendItemToolTipGenerator()는 도구 팁과 전체, 끊어지지 않는 문자열을 표시 할 수 있습니다.

    renderer.setLegendItemToolTipGenerator(
        new StandardXYSeriesLabelGenerator("Legend {0}")); 
    
  • here을 보여

    사용 addChartMouseListener(), 앞으로 마우스 인접한 텍스트 구성 요소에 전설을 통해 이벤트를 옮겼습니다.

+0

후자의 관련 예제가 있습니다. (http://stackoverflow.com/a/8219445/230513) – trashgod

+0

내 고객 ;-) 나는 그들이 두 번째 것에 대해 어떻게 생각하는지 물어볼 것입니다. 그들은 내 툴팁 아이디어를 거부했다 : ( – Shikiryu

+0

첫 번째 예제에 대한 예제가 있습니까? afterall에 관심이있을 수 있습니다. – Shikiryu