2011-10-17 97 views
4

我打算繪製一條從實線變爲虛線的線形圖,以指示真實的數據和預測數據。我不確定是否需要擴展一些像XYLineAndShapeRenderer或其他類的類,或者有一些方便的方法來實現它?JFreechart(Java) - 如何繪製部分虛線和部分實線的線條?

這是一個使用Excel繪製的演示圖。

enter image description here

我說的是圖中的灰色線條。這就是我想要的。 我不知道是否有渲染器允許我指出哪個範圍是虛線還是實線

回答

12

有兩種方法我可以考慮這樣做。他們沒有一個是優雅的,但這可能是你的問題的現實。

一個是你可以定義兩個系列碰巧相互連接。這可能是你最好的選擇,但你也必須修復你的傳奇。

這將使你的第二個系列展示爲虛線:

plot.getRenderer().setSeriesStroke(
    1, 
    new BasicStroke(
     2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 
     1.0f, new float[] {6.0f, 6.0f}, 0.0f 
    ) 

編輯:我原來的「第二選擇」是錯誤的。以下是更好的方法:

覆蓋AbstractRenderer中的getItemStroke()方法。

 final BasicStroke dashedStroke = new BasicStroke(
        2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 
        1.0f, new float[] {6.0f, 6.0f}, 0.0f); 
    XYLineAndShapeRenderer render = new XYLineAndShapeRenderer() { 
     @Override 
     public Stroke getItemStroke(int row, int column) { 
      if (column < dashedThreshold) { 
       return lookupSeriesStroke(row); 
      } else { 
       return dashedStroke; 
      } 
     }; 
+2

+1 ...儘管'getItemStroke'不應該每次都創建一個新的'BasicStroke'。每次重新繪製時,它都會爲每個系列的每個項目調用。 –

+3

@ReverendGonzo好點,固定。 –

+0

謝謝。我也是這樣想的。只是想看看有沒有更簡單的解決方案,謝謝:) – Biscuitz

0

也許您應該爲真實數據與預測數據定義不同的數據集。改變線條樣式不僅會更簡單,而且代碼也可能更清晰。

2

您可以擴展XYLineAndShapeRenderer,並覆蓋getItemStroke在那裏你提供不同的項目不同的行程。

默認實現只是返回系列筆畫。

+0

+1這是最好的方法。 – trashgod

+0

+1剛剛在編輯我的視頻後看到了你的解決方案...我保證我沒有試圖撕掉你:P –